C 通用快速分叉()说明
假设我们有这样的东西:C 通用快速分叉()说明,c,fork,C,Fork,假设我们有这样的东西: printf("A"); fork(); printf("B"); 输出是否将是 1) 阿巴布 2) 神甫 您能解释一下吗?输出应为“ABB” fork将整个程序复制到一个新的内存空间,并从fork继续。由于两个进程运行相同的代码,我将保存从fork返回的进程id,以便程序的其余部分知道该做什么。输出应为“ABB” fork将整个程序复制到一个新的内存空间,并从fork继续。由于两个进程运行相同的代码,我将保存从fork返回的进程id,以便程序的其余部分知道该做什么。正
printf("A");
fork();
printf("B");
输出是否将是
1) 阿巴布
2) 神甫
您能解释一下吗?输出应为“ABB”
fork将整个程序复制到一个新的内存空间,并从fork继续。由于两个进程运行相同的代码,我将保存从fork返回的进程id,以便程序的其余部分知道该做什么。输出应为“ABB”
fork将整个程序复制到一个新的内存空间,并从fork继续。由于两个进程运行相同的代码,我将保存从fork返回的进程id,以便程序的其余部分知道该做什么。正确的答案是它取决于stdout的缓冲模式,其他答案似乎忽略了该模式
当您使用未刷新的缓冲区进行fork,然后在两个进程中继续使用stdio时(而不是在子进程中使用通常的quick
execve
或\u exit
),fork时缓冲区中的内容可以打印两次,每个进程一次。正确的答案是,它取决于标准输出的缓冲模式,其他答案似乎忽略了该模式
当您使用未冲洗的缓冲区进行fork,然后在两个进程中继续使用stdio时(而不是在子进程中使用通常的quick
execve
或\u exit
),fork时缓冲区中的内容可以打印两次,每个进程打印一次。它未定义且ABB
,ABAB
和AABB
是可能的。首先(ABB
)只能在无缓冲输出上发生;对于缓冲输出,两个进程的输出缓冲区中都有A
。通过在fork(2)
之前调用fflush(3)
,可以强制执行此行为
最后一个字符的顺序取决于执行顺序;您很可能会得到
ABAB
,因为在这个简短的示例中,程序不会被调度程序中断。它是未定义的,并且ABB
,ABAB
和AABB
是可能的。首先(ABB
)只能在无缓冲输出上发生;对于缓冲输出,两个进程的输出缓冲区中都有A
。通过在fork(2)
之前调用fflush(3)
,可以强制执行此行为
最后一个字符的顺序取决于执行顺序;您很可能会得到
ABAB
,因为在这个简短的示例中,程序不会被调度程序中断。输出只是abb。Fork创建一个新的子进程,这样在执行Fork()之后,两个进程将运行,通常子进程首先有机会执行。只查看fork之前的一个进程,因此fork之前的输出只执行一次A。然后fork执行,因此现在运行的两个不同进程将打印B,因此输出为ABB。输出为ABB。Fork创建一个新的子进程,这样在执行Fork()之后,两个进程将运行,通常子进程首先有机会执行。查看fork之前只有一个进程,因此fork之前的输出只有一次A。然后fork执行,因此现在运行的两个不同进程将打印B,因此输出为ABB。这听起来像是您可以自己快速尝试的东西,不是吗?@DanFego,他似乎已经尝试过了,难怪他给出了两个示例输出。。。他不能仅仅猜测“ABB”将被输出。这听起来像是你可以自己快速尝试的东西,不是吗?@DanFego,他似乎已经尝试过了,难怪他给出了两个样本输出。。。他不能仅仅猜测“ABB”将被输出。“第一个(ABB)可能发生…”不应该这样写:“…将发生…”对于缓冲输出,A
和B
这两个出现的可能排列的数量是非常明确和有限的。“第一个(ABB)可能发生…”不应该这样写:“…将发生…”?对于缓冲输出,A
和B
这两种情况的可能排列的数量是非常明确和有限的。