提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我试图理解以下代码:
int main(int argc, char **argv)
{
int pid1,pid2;
if((pid1=fork())<0)
{
printf("Error bla bla");exit(1);
}
else printf("A");
if((pid2=fork())<0)
{
printf("Error bla bla");exit(2);
}
if(pid1==0)printf("B\n");
if(pid2==0)printf("C\n");
exit(0);
return 0;
}
我得到的输出看起来像这样:
A
AC
AB
AB
C
如果我将第一个打印更改为printf("A\\n");
输出是
A
C
A
B
B
C
在这种情况下流程如何表现? 我知道第二个fork()
在父进程和第一个子进程中都执行了,但是为什么输出看起来像这样?
另外,为什么它按该特定顺序打印最后3个字母?
首先,我认为此序列的结果定义不明确-取决于printf()的实现者和流程调度的变数。
通常,printf()将字符累积在缓冲区中,并在需要时打印它们-除非通常存在换行符'\\ n'触发立即打印。
如果该进程派生的字符仍保留在printf()缓冲区中,则父进程和子进程最终都将打印这些字符。 您分叉两次,导致4个过程。 我将原始进程称为G(祖父母)。 G在第一个分叉处创建P(arent)。 P的pid1 ==0。接下来,每个进程再次派生。 假设G创建A(unt),P创建C(hild)。 A和C的pid2 ==0。C的pid1 == 0。
它们全部都打印了原始A \\ n,或者在其printf缓冲区中有A。
那些pid1 == 0的人则打印f B \\ n。 如果缓冲区中还有A,则显示为AB \\ n pid2 == 0的那些,然后输出C \\ n
所以顺序是
G: A(\n)
P: A(\n)B\n
A: A(\n)C\n
C: A(\n)B\nC\n
G,P,A和C的运行顺序不确定。 但是任何给定进程的输出均按其printf()d的顺序显示。 它可能与其他进程的输出交错。
如果A上印有\\ n,则从除祖父母之外的所有序列中删除A(\\ n)。
造成混淆的可能原因是printf("A");
的输出printf("A");
在第二个fork时实际上没有写在终端上。 它在内存缓冲区中,因此将与其余过程一起复制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.