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
这两种情况的可能排列的数量是非常明确和有限的。