c - fork()的执行过程

标签 c fork

我执行了以下代码:

#include<stdio.h>

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

   return 0;
}

输出:hello hello hello hello

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

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

请解决这个问题。

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

最佳答案

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

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

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

如果:

#include<stdio.h>

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

   return 0;
}

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

关于c - fork()的执行过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18909316/

相关文章:

c - 在 C 编程中反转前 n 个数字的数组

c - Linux : watchdog node is not created in/dev directory

c - 指向字段的指针 - 赋值错误/警告

c - forkall 没有按预期工作

c - fork() 之后 execv() 的 Echo 问题

linux - (UNIX) fork() 如何在循环中工作?

c - fwrite() 不向文件写入任何内容 - C

c - 防止控制台窗口在 Visual Studio 中关闭

c - C while 循环中的 fork() 和 wait() ?

C编程管道只工作了一半