请看这里的代码。我的计划是在一个 while 循环内执行一个 for 语句。在 for 循环后,我使用 fork。现在我有一个父进程和一个 child1。在父进程中,我执行另一个 fork,得到一个父进程和 child2。现在我的问题是:
1)为什么当 x=3 时,“fork1 successful”语句会打印两次?
2)对于 x=2,与 x=3 发生了相同的问题。它说 fork1 和 fork2 都成功了,但没有进入 child1 和 child2。它跳过了“n=waitpid(-1, &status, 0);”这一行,直接打印 n,然后减少 x 并转到“x=1;”。
3)对于 x=1,我认为输出混乱了,为什么在 SENDING 1 和 SENDING 2 之间打印了一个“child1 pid=4783”。fork1 又打印了两次。
请帮我解决这些问题。我一直在阅读帖子,但似乎没有看到类似的问题。我可能漏掉了什么?非常感谢!以下是我的代码片段:
以下是结果:
1)为什么当 x=3 时,“fork1 successful”语句会打印两次?
2)对于 x=2,与 x=3 发生了相同的问题。它说 fork1 和 fork2 都成功了,但没有进入 child1 和 child2。它跳过了“n=waitpid(-1, &status, 0);”这一行,直接打印 n,然后减少 x 并转到“x=1;”。
3)对于 x=1,我认为输出混乱了,为什么在 SENDING 1 和 SENDING 2 之间打印了一个“child1 pid=4783”。fork1 又打印了两次。
请帮我解决这些问题。我一直在阅读帖子,但似乎没有看到类似的问题。我可能漏掉了什么?非常感谢!以下是我的代码片段:
while(x>0)
{
printf("x=%d\n", x);
for(i=0; i<3; i++)
{
printf("SENDING %d\n", i);
}
pid1=fork();
printf("fork1 successful\n");
if(pid1>0)
{
printf("RECEIVING %d\n", i);
pid2=fork();
if(pid2>0)
{
printf("fork2 successful\n");
n=waitpid(-1, &status, 0);
printf("%d\n", n);
if(n==pid1) //sleep done
{
kill(pid2, SIGKILL);
printf("Child1 ran. Child2 killed.\n\n");
}
else if(n==pid2) //scanf received
{
kill(pid1, SIGKILL);
printf("Child2 ran. Child1 killed.\n\n");
}
}
else
{
printf("child2 pid=%d\n", getpid());
scanf("%d", &y);
exit(1);
}
}
else
{
printf("child1 pid=%d\n", getpid());
sleep(5);
exit(0);
}
x--;
}
以下是结果:
x=3
SENDING 0
SENDING 1
SENDING 2
fork1 successful
RECEIVING 3
fork1 successful
child1 pid=4781
fork2 successful
child2 pid=4782
4781
Child1 ran. Child2 killed.
x=2
SENDING 0
SENDING 1
SENDING 2
fork1 successful
RECEIVING 3
fork1 successful
fork2 successful
4782
x=1
SENDING 0
SENDING 1
child1 pid=4783
SENDING 2
fork1 successful
RECEIVING 3
child2 pid=4784
fork2 successful
child2 pid=4786
fork1 successful
child1 pid=4785
1
4784
printf
放在fork
之后,因此父进程和子进程都会输出该行,并且你看到那行被输出了两次。不清楚你所说的“child1 和 child2 都没有进入”的意思。输出显示它们确实有进入——child1 pid=
和child2 pid=
的输出来自子进程。 - kaylumfork
之前确保调用fflush
,否则如果输出被重定向,程序会突然以奇怪的方式失败。 - o11c