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没有问题 – 它按指定的方式工作。