2

我已经执行了以下代码:

#include<stdio.h>

int main()
{
    printf("hello \t");
    fork();
    fork();

   return 0;
}

输出 :hello hello hello hello

这是否意味着除了被执行的调用fork()之外,为子进程创建与父进程完全相同的代码副本?fork()

这让我很困惑,因为我在某个地方研究过“fork()从代码的下一行开始执行”。因此,如果这是真的,那么它应该创建 3 个子进程和 1 个父进程,并且应该"hello"只打印一次。

请解决这个问题。

我在 gcc 编译器上运行了这段代码。

4

2 回答 2

4

这是因为字符串“hello”存储在父进程的输出缓冲区中。

printf遇到 时刷新缓冲区\n,否则仅当缓冲区已满时才打印输出字符串。

默认情况下,子进程继承父进程的缓冲区,所以如果缓冲区没有刷新,子进程的缓冲区也包含“hello”。

如果 :

#include<stdio.h>

int main()
{
    printf("hello \n");
    fork();
    fork();

   return 0;
}

你只会看到一个“你好”。

于 2013-09-20T05:23:32.277 回答
1

这是因为 printf ......你说使用 printf("hello \n") 以便在换行符之后刷新缓冲区,或者你可以在你的代码中使用 fflush(stdout) 并且输出将只是一个你好......

于 2013-09-20T05:32:12.507 回答