父代码在C中的多进程程序中被调用两次

时间:2018-06-29 13:43:17

标签: c process fork

我一直在学习c语言中的fork,并且我有这个程序:

 int main(void) {
     int i;
     printf("Start program\n");
     printf("This is parent process %d: %d\n", getpid(), i);
     int pid = fork();
     printf("%d ", pid);
     if(pid == 0) {
       printf("This is process %d: %d\n", getpid(), i);
     } 
   return 0;
 }

这是输出:

Start program
This is parent process 4467: 0
4578 Start program
This is parent process 4467: 0
0 This is process 4578: 0

我不明白为什么两次调用父代码。

1 个答案:

答案 0 :(得分:8)

stdout已缓冲。参见例如setvbuf(3)

您忘记做fflush(3)之前先打电话给fork(2)。根据经验,最好在fflush(NULL)之前做fork()

这可以解释观察到的行为(因为在父进程和子进程中稍后都会进行刷新,例如在程序退出时或在crt0中从main返回时)。您可能(在Linux上)使用strace(1)更准确地了解正在发生的事情。

顺便说一句,fork(2)可能会失败。您应该处理该情况(即处理pid == -1(或pid<0)...)。