考虑以下程序的输出:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
void main()
{
pid_t pid;
int a = 5;
pid = fork();
if (pid == 0)
printf("This is the son process, a = %d\n", --a);
else
printf("This is the dad process, a = %d\n", ++a);
}
我期望的输出是:
This is the son process, a = 4;
This is the dad process, a = 6;
但我得到了输出:
This is the son process, a = 4
那么为什么父进程没有执行printf?我怎样才能得到我想要的输出?
更新:
刚才我再次尝试,输出如下:
$ gcc fork.c -o fork
$ ./fork
This is the dad process, a = 6
$ This is the son process, a = 4
现在还有一个问题:为什么两行输出之间有$
?
我认为预期的输出应该是这样的:
$ gcc fork.c -o fork
$ ./fork
This is the dad process, a = 6
This is the son process, a = 4
我无法弄清楚为什么会出现$
。
更多详情:
gcc version: gcc 4.8.2
OS: ubuntu 14.04
答案 0 :(得分:4)
你需要检查&#34; fork失败&#34;条件。当fork()返回-1时,发生错误。这是函数语义的一部分,因此如果省略它,将得到不正确的结果。
请参阅一个示例,该示例考虑了fork失败的可能性here。
在此related question中查看有关fork可能失败的原因的讨论。
答案 1 :(得分:0)
$
只是在流程输出之间显示的提示。因为孩子跑了'#34;脱离&#34;从父级开始,父级可以在子级完成之前返回shell。然后打印提示,然后输出孩子的输出。如果您将所有输出重定向到文件,则$
将不在那里。