首页 > 解决方案 > 父代码在 C 中的多进程程序中被调用两次

问题描述

我一直在学习 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

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

标签: cprocessfork

解决方案


标准输出被缓冲。参见例如setvbuf(3)

在执行fork(2)之前,您忘记调用fflush(3 ) 。根据经验,您最好在任何.fflush(NULL)fork()

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

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


推荐阅读