【发布时间】:2015-07-16 03:03:48
【问题描述】:
请考虑在此处查看我的代码。我的计划是我有一个while循环。在那个 while 循环中,我执行了一个 for 语句。在for循环之后,我使用fork。现在我有一个父母和一个child1。在父级内部,我执行了另一个分叉,给了我一个父级和child2。现在我的问题是:
1) 为什么当x=3 时,“fork1 成功”语句会打印两次?
2) 对于x=2,x=3 也出现了同样的问题。它说 fork 1 和 fork 2 成功但没有输入child1 和child2。它跳过了n=waitpid(-1, &status, 0);这一行,然后继续打印n,然后是x--并转到x=1;
3) 对于 x=1,我认为输出确实混淆了,例如为什么在 SENDING 1 和 SENDING 2 之间打印了“child1 pid=4783”。fork 1 也再次打印了两次。
请帮我解决这些问题。我一直在阅读帖子,但似乎看不到类似的问题。我可能错过了什么?太感谢了! 这是我的代码的 sn-p:
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
【问题讨论】:
-
你的问题太多了。让人困惑。前两个问题的答案很简单。
fork后面有printf。因此,父母和孩子都会打印它,因此您会看到该行输出了两次。不清楚“没有同时输入 child1 和 child2”是什么意思。输出显示确实如此 -child1 pid=和child2 pid=输出来自子进程。 -
对不起,我的错。我想说的是,对于 x=2,child1 和 child2 pid 没有打印,这就是我的意思是“没有输入 child1 和 child2”。但我注意到对于 x=1,打印了 4 个子 pid
-
模糊相关:确保在
fork之前调用fflush,否则如果重定向输出,这将突然以奇怪的方式失败。
标签: c for-loop while-loop fork