2014-11-23 2 views
1

Я пытаюсь обновить некоторые навыки C, и я играю с кодом в fork и общаюсь между двумя процессами.Устранение неисправностей Родительский процесс после Fork, C

В приведенной ниже программе я ожидал, что сигнал SIGINT для ребенка заставит родителя прекратить работу до того, как он напечатает, что ребенок умер. Однако сообщение «Parent: chlid is dead» по-прежнему остается последним для печати.

Есть ли что-то, что мне не хватает?

Спасибо.

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

int main() { 
    char *msg; 
    int forkval, parentpid; 
    int p2c[2]; 

    pipe(p2c); 

    forkval = fork(); 

    if (forkval < 0) exit(EXIT_FAILURE); 

    if (forkval) { /* Parent */ 
     msg = "Parent: reporting\n"; 
     close(p2c[0]); 
     write(STDOUT_FILENO,msg,strlen(msg)); 
     write(p2c[1], &forkval, sizeof(int)); 
     close(p2c[1]); 
     wait(NULL); 
     msg = "Parent: chlid is dead\n"; 
     write(STDOUT_FILENO, msg, strlen(msg)); 
    } else { /* Child */ 
     msg = "Child: reporting\n"; 
     close(p2c[1]); 
     write(STDOUT_FILENO,msg,strlen(msg)); 
     read(p2c[0], &parentpid, sizeof(int)); 
     close(p2c[0]); 
     fprintf(stdout, "Child: parent's pid is %i\n", parentpid); 
     kill(parentpid,SIGINT); 
     fprintf(stdout, "Child: dying\n"); 
    } 
    exit(EXIT_SUCCESS); 
} 

терминальный выход:

Parent: reporting 
Child: reporting 
Child: parent's pid is 10940 
Parent: chlid is dead 
+0

Эта строка: читать (p2c [0], & parentpid, sizeof (int)); на самом деле является дочерним PID, а не родительским PID. Так что ребенок убивает себя – user3629249

ответ

1

Ненулевое значение, что fork возвращает это pid ребенка. Таким образом, ребенок убивает себя, и поэтому вы не видите сообщение "Child: dying" от ребенка, но смотрите последнее сообщение от родителя.

+2

Спасибо, это была именно проблема. Использование вызова getppid() вместо идентификатора процесса из трубы заставляет все работать. – Ryan

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