2013-06-30 3 views
0

Я написал базовую программу C++ в unix с системным вызовом fork() и wait(). Я всего лишь создаю одного ребенка. Я использовал две трубы. Итак, после работы fork с первым каналом я пишу от дочернего к родительскому, и как только родитель получает данные, родитель возвращается к дочернему во втором канале. после этого в родительской стороне я использую системный вызов wait (0). но все же мой родительский процесс умирает перед дочерним процессом?Проблема с вилкой и системным вызовом wait

структура что-то вроде этого:

main() 
char buff[] = "Parent process kills"; 
char cuff[] = "before Child process"; 
int fd1[2]; 
int fd2[2]; 
pipe(fd1); 
pipe(fd2); 
if((pid = fork()) == 0) 
{ 
    close(fd1[0]); 
    close(fd2[1]); 
    write(fd1[1],buff,strlen(buff)+1); 
    read(fd2[0],cuff,sizeof(cuff)); 

} 
else 
{ 
    close(fd1[1]); 
    close(fd2[0]); 

    read(fd1[0],buff,sizeof(buff)); 
    write(fd2[1],cuff,strlen(cuff)+1); 
    wait((int *) 0); 
    } 

    close(fd1); 
    close(fd2); 

    }' 

Несмотря на ожидание() используется, но до сих пор родительский процесс умирает до ребенка. Спасибо в adavance.

+0

Помните, что 'fork' может потерпеть неудачу, и в этом случае возвращает' -1'. Поэтому ваш оператор 'if' не будет работать в этом случае. Вы всегда должны * проверять возвращаемые значения для сбоев. –

ответ

0

Ваш вызов read приводит к неопределенному поведению. Вы пытаетесь читать строки, а не буферы, которые у вас есть. В этом случае это, вероятно, приводит к сбою.

Ваши звонки write также записывают строковый литерал, а не тот буфер, который у вас есть.

Кроме того, поскольку у вас есть символьные массивы, инициализированные для строк, sizeo(buff) и strlen(buff) + 1 равны.

0

Вы уверены, что не умираете из-за segfault? Каждая из этих команд пытается отправить больше, чем вы намерены:

write(fd1[1],"buff",strlen(buff)+1); 

и

write(fd2[1],"cuff",strlen(cuff)+1); 

и каждый из них пытается получить в память только для чтения:

read(fd2[0],"cuff",sizeof(cuff)); 

и

read(fd1[0],"buff",sizeof(buff)); 
+0

В accutal code is Это код аккутанта. Пожалуйста, изучите этот код, объясните, почему родительский процесс завершается до дочернего процесса. main() pid_t pid; char buff [] = "Родительский процесс убивает"; char манжета [] = "до детского процесса"; int fd1 [2]; int fd2 [2]; труба (fd1); труба (fd2); if ((pid = fork()) = 0) { close (fd1 [0]); close (fd2 [1]); write (fd1 [1], buff, strlen (buff) +1); читать (fd2 [0], манжета, размер (манжета)); } прочее { закрыть (fd1 [1]); close (fd2 [0]); читать (fd1 [0], buff, sizeof (buff)); запись (fd2 [1], манжета, strlen (манжета) +1); wait ((int *) 0); } закрыть (fd1); close (fd2); } – shaantanupareek

0

Существует тонкая ошибка в строке

if(pid == fork()) 

Вы сравните результат вилки() с PID вместо присвоения ему и сравнивая его с нулем. То, что вы хотели написать это:

if((pid = fork())) 

Обратите внимание на дополнительный набор скобок, говорит компилятору, что вы действительно хотите, чтобы выполнить задание, и что вы не хотите получить предупреждение об этом.

И исправленное, если у вас есть родитель, выполняющий первый случай, а не второй, поэтому правильный код будет:

if(pid == fork()) { 
    close(fd1[1]); 
    close(fd2[0]); 

    read(fd1[0],"buff",sizeof(buff)); 
    write(fd2[1],"cuff",strlen(cuff)+1); 
    wait((int *) 0); 
} else { 
    close(fd1[0]); 
    close(fd2[1]); 
    write(fd1[1],"buff",strlen(buff)+1); 
    read(fd2[0],"cuff",sizeof(cuff)); 
} 
+0

Это код аккутационного кода. Пожалуйста, изучите этот код, объясните, почему родительский процесс завершается до дочернего процесса. main() pid_t pid; char buff [] = "Родительский процесс убивает"; char манжета [] = "до детского процесса"; int fd1 [2]; int fd2 [2]; труба (fd1); труба (fd2); if ((pid = fork()) = 0) { close (fd1 [0]); close (fd2 [1]); write (fd1 [1], buff, strlen (buff) +1); читать (fd2 [0], манжета, размер (манжета)); } прочее { закрыть (fd1 [1]); close (fd2 [0]); читать (fd1 [0], buff, sizeof (buff)); запись (fd2 [1], манжета, strlen (манжета) +1); wait ((int *) 0); } закрыть (fd1); close (fd2); } – shaantanupareek

+0

Помните, что один знак равенства - это _allways_ задание. Поэтому 'if ((pid = fork()) = 0)' сначала присваивает возвращаемое значение pid и присваивает ему нуль, что также является значением всего выражения. И ноль ложный. Таким образом, оба процесса, дочерние и родительские, выполняют предложение 'else'. Следовательно, оба процесса закрывают один и тот же конец трубы =>, когда они читают его, больше нет конца записи. Посмотрите на страницу руководства трубы, и вы найдете полный рабочий пример. – cmaster

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