C fork调用中的奇怪输出

我有以下C代码。

#include  #include  #include  int main () { int i=1; pid_t child_pid = fork(); if (child_pid == 0) { printf ("%d\n", i++); printf ("%d\n", i++); printf ("This is child process."); return 0; } else if (child_pid > 0) { printf ("%d\n", i++); printf ("This is parent process."); } else { printf("Fork failed"); } } 

我按如下方式编译了以下内容: gcc testFork.c并通过键入./a.out运行代码。

我得到的输出是:

 vmw_ubuntu@vmwubuntu:~/Desktop/Test C$ ./a.out 1 This is parent process.vmw_ubuntu@vmwubuntu:~/Desktop/Test C$ 1 2 This is child process. 

为什么vmw_ubuntu@vmwubuntu:~/Desktop/Test C$出现在不知名的地方?

我只是期待这个输出:

 vmw_ubuntu@vmwubuntu:~/Desktop/Test C$ ./a.out 1 This is parent process.1 2 This is child process. 

因为你没有在printf调用结束时添加换行符’\ n’转义字符; 因此,当你的父进程返回到你的shell时,你的shell`vmw_ubuntu @vmwubuntu:〜/ Desktop / Test C $’的提示被附加到结尾。

请记住,当您调用’fork’时,您将创建同一进程的2个单独副本。 它不再是1个程序,父母可以在孩子面前返回。

编辑:

要实现所需的输出,需要插入对“waitpid”函数的调用。 见http://linux.die.net/man/2/wait

问题可能是printf函数被缓冲: 为什么printf在调用后不会刷新,除非换行符在格式字符串中? 禁用缓冲或使用无缓冲的write(..)。 fork没有问题 – 它按指定的方式工作。