我一直在努力理解这个程序的输出,但我仍然不太明白。
main()
{
int pid, i;
pid = getpid();
for (i = 0; i < 25; i++)
{
switch (fork())
{
case 0:
if (pid % 2 == 0)
{
exit(0);
break;
}
default:
if (pid % 2 != 0)
{
exit(0);
}
}
}
printf("I am the process %d and my father is the process %dn", getpid(), getppid());
while (wait(NULL) > 0) {}
return 0;
}
当我运行这个时,它返回:
我是进程11110,我父亲是进程26453
但是,如果运行上面的代码时没有&;% 2&;,它将不会返回任何东西。
我对此很困惑。我认为它的工作方式(对于没有"% 2"的代码)是,对于每个for迭代:
- 子进程(pid==0)将完成其进程(杀死子进程)并始终从开关断开(不影响for循环)
- 父进程/主进程将等待,直到子进程死亡
- 下一个迭代
以上方法正确吗?如果是这样,那么"% 2"又如何呢?
如果没有% 2
,你会得到:
switch (fork())
{
case 0:
if (pid == 0)
{
exit(0);
break;
}
default:
if (pid != 0)
{
exit(0);
}
}
由于pid
不为0,父节点将exit(0)
紧接在第一个fork()
之后,因此您不会看到打印语句。