2014-10-15 2 views
0

Так что это простая программа для создания двух процессов: родительского и дочернего. Итак, я сделал приветствие внутри родителя и имя внутри дочернего процесса. По какой-то причине мой дочерний процесс не печатает, несмотря на то, что я вызвал wait() внутри родителя. Что мне делать?C программный дочерний процесс не выполняется

ЗАДАЧА ВЫВОД: «Привет Сэм» OUTPUT I "M ПОЛУЧЕНИЕ:„ Привет“

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main() 
{ 
    char *greeting = "Hello"; 
    char *name; 


    pid_t pid; 

    pid = fork(); 

    if(pid == 0) 
    { 
     name = "Sam"; 
     exit(0); 
    } 
    else if(pid == -1) 
     printf("Fail\n"); 
    else{ 
     wait(0); 
    printf("%s %s", greeting, name); 
    } 

} 

ответ

3

Когда вы совершаете вызов fork(), дочерний процесс получит копию адресного пространства родительского процесса (переменные и т. Д.). Это означает, что у ребенка определяется имя из родителя. Однако «имя» в дочернем процессе - это просто копия. Поэтому его изменение в дочернем процессе не влияет на родителя.

Чтобы получить поведение, которое я чувствую после вас, замените fork() на vfork(). Для целей этого обсуждения единственной разницей является то, что:

  1. Адресное пространство делится вместо копирования. Редактирование «имени» в дочернем процессе будет отражено в родительском процессе
  2. Родительский процесс приостанавливается, пока выполняется дочерний процесс. Я предполагаю, что это нормально, потому что вы уже называют ожидание() в родительском процессе

Edit: Я забыл добавить, что если вы идете маршрут vfork, изменение выхода() для _Exit() в дочернем процессе

+0

Приостановка родительского процесса во время выполнения дочернего процесса будет лучше, потому что в случае отсутствия его приостановки каким-либо образом, даже если адресное пространство было разделено, не было бы гарантии, что дочерний процесс будет напишите в 'name', прежде чем родительский процесс попытается выполнить' printf() 'it. 'vfork()' удаляется в POSIX.1-2008, кстати, и устарел с 2001 года. –

+0

Исправить. Когда я сказал: «Я предполагаю, что все в порядке», я думаю, я должен был сказать «я предполагаю, что это то, что вы пытаетесь», –

0

процесс Ребенок однажды раздвоенный будет работать independantly родительского процесса Итак, когда вы set name="Sam" в детстве она в разных программа, чем Printf. Таким образом, вы не в состоянии увидеть сообщение.

0

в дочернем процессе, вы назначили name, а затем выйти.

if(pid == 0) 
{ 
    name = "Sam"; 
    exit(0); 
} 

Строка printf("%s %s", greeting, name); выполняется только в ветке else, то есть в родительском процессе. Это фактически неопределенное поведение, потому что name uninitliazed.

Смежные вопросы