C fork()命令

C fork()命令,c,parallel-processing,fork,C,Parallel Processing,Fork,有人问,在C中运行以下代码后,要打印多少个A: int i; for (i=1;i<4;i++){ fork(); printf("A"); } inti; 对于(i=1;i而言,不同数量A的原因是线路缓冲 第一个版本不打印新行,因此直到程序退出,printf才被实际写入 由于fork()调用复制了整个正在运行的进程,因此它还复制了A的缓冲行 然后,当每个进程退出时,它将刷新其缓冲区以输出 第二个版本的程序会在每次printf调用时刷新其输出,这是因为新行以及大多数C

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

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

对于(i=1;i而言,不同数量A的原因是线路缓冲

第一个版本不打印新行,因此直到程序退出,printf才被实际写入

由于fork()调用复制了整个正在运行的进程,因此它还复制了A的缓冲行

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


第二个版本的程序会在每次printf调用时刷新其输出,这是因为新行以及大多数C实现在打印到终端时刷新新行上的缓冲区这一事实。(如果打印到文件或网络套接字,则不会刷新。)发生这种情况的原因是printf是行缓冲的,也就是说,它的缓冲区只有在遇到新行时才会被刷新

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

在第一种情况下

在第一个fork()之后:

在第二个fork()之后:

在第三个fork()之后:


因此,最后,由于您总共有8个进程,8*3=24。因此,由于您没有验证
fork()
的返回值,因此我假设您将达到最大进程数。为了使您的程序更具可预测性,请调用
fflush(stdout);
在每次调用
printf
后立即执行。这样,当您转到fork时,进程的标准输出缓冲区中就没有任何内容了。那么每次都应该得到14。
 int i;
 for (i=1;i<4;i++){
      fork();
       printf("A\n");
 }
  Buffer : A
  Buffer : AA
  Buffer : AAA ( 3 A's exist in the buffer )