【问题标题】:A fork() command [duplicate]fork() 命令[重复]
【发布时间】:2016-11-01 11:04:51
【问题描述】:

有人询问了在 C 中运行以下代码后要打印多少个 A:

int i;
for (i=1;i<4;i++){
     fork();
     printf("A");
}

我自己数了 14 个。但是,运行它后,结果是 24。 后来我运行了一个修改后的版本:

 int i;
 for (i=1;i<4;i++){
      fork();
       printf("A\n");
 }

其中印有 14 个 A。我很想有人向我解释这一点。

【问题讨论】:

  • 由于你没有验证fork()的返回值,我假设你已经达到了你的最大进程数。

标签: c parallel-processing fork


【解决方案1】:

A 数量不同的原因是行缓冲。

第一个版本不打印换行符,所以 printf 直到程序退出才真正写出。

由于 fork() 调用复制了整个运行过程,它也复制了 A 的缓冲行。

然后,当每个进程退出时,它会将其缓冲区刷新到输出。

程序的第二个版本在每次 printf 调用时都会刷新其输出,因为如果要打印到终端,则大多数 C 实现都会在换行符上刷新缓冲区。 (如果您打印到文件或网络套接字,它不会刷新。)

【讨论】:

  • 因此,为了使您的程序更可预测,请在每次调用 printf 之后立即调用 fflush(stdout);。这样,当你去 fork 时,你的进程的标准输出缓冲区中不会留下任何东西。那么你应该每次都得到 14 个 As。
【解决方案2】:

发生这种情况是因为 printfline-buffered ,即它的缓冲区仅在遇到换行时才会被刷新。

在第二种情况下,您放置了一个 '\n' ,因此每次清除缓冲区时都会发生预期的行为。

在第一种情况下,

在第一次 fork() 之后:

  Buffer : A

在第二次 fork() 之后:

  Buffer : AA

第三次 fork() 之后:

  Buffer : AAA ( 3 A's exist in the buffer )

因此,最终您总共有 8 个进程,8 * 3 = 24。因此 24 个 A

【讨论】:

    猜你喜欢
    • 2018-07-07
    • 2016-10-29
    • 2015-01-01
    • 2011-11-04
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多