gpt4 book ai didi

c - fork()系统调用的工作(C程序)

转载 作者:太空宇宙 更新时间:2023-11-04 06:20:48 25 4
gpt4 key购买 nike

当我运行这段代码时,它打印了 20 次“hello world”。根据我的理解,它应该打印 32 次。此外,每次运行都会以不同方式打印换行符。我不明白这一点。请帮忙。

int
main(int argc, char** argv){
if(fork() || fork())
fork();
if(fork() && fork())
fork();
printf("\nhello world");
return 0;
}

最佳答案

要理解您必须剖析这两个结构。首先构造

if( fork() || fork() )
fork();

或通过展开短路以另一种方式编写或:

if( !fork() )
if( !fork() )
goto not_taken;
fork();
not_taken:

或者没有goto

if( !fork() ) {
if( fork() )
fork();
}
else
fork();

将进程数增加五倍。这是因为首先原始进程 fork ,然后在子进程中 fork 将返回零,它将再次 fork(短路或)。然后,如果其中任何一个返回非零值(即 fork 的父进程),它将再次 fork ——这恰好在父进程和它的子进程中完成。即条件中的 fork 将被调用一次,最后一个 fork 将被运行一次。

现在是第二个构造:

if( fork() && fork() )
fork();

或展开短路和:

if( fork() )
if( fork() )
fork();

进程数将增加四倍。原因是第一个 fork 将在父进程中运行,如果它返回非零(即父进程),第二个 fork 将被调用,如果最后的遗嘱返回非零值。所以这里所有三个 fork 都在原始进程中被调用 - 这意味着它被调用了三次。

因此,第一个构造将使它们成为五个进程,然后第二个构造将为每个进程再创建三个。这意味着我们将有 5*4 个进程。

你没有获得一致的换行符的原因可能主要是由于 printf 缓冲。 printf 只会立即打印出一个换行符,然后在它终止时写入其余数据,这意味着它们分两步打印字符串。我们有 20 个进程,它们首先打印一个换行符,然后同时打印“hello world”——无法保证不同进程打印内容之间的顺序。

一个小的可能性是实际的打印输出不需要是原子的。也就是说,一个进程可能会写入“hell”,然后第二个已经写入“hello”的进程开始写入可能是“world”——这将导致“hellworld”。

关于c - fork()系统调用的工作(C程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35475031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com