首页 > 有关fork的一道面试题

有关fork的一道面试题

依然还是我,那个喜欢问面试题的人文专业的少年


头文件已省略

int main(void) 
{
   int i;
   for (i=0; i<2; i++) {

     fork();
      printf("-\n");
   }
   return 0;
}

上面代码输出多少个-
如果最后printf语句中布加\n呢。
我知道下面的网友肯定会贴出这么一篇文章,http://coolshell.cn/articles/7965.html
可惜小弟没看懂。
为什么我在电脑上得运行与题目的答案给出的不一致呢?


会输出6个-

那个代码,它修改后加了PID的那个例子可以用来分析这个问题。

ppid=8858, pid=8518, i=0
ppid=8858, pid=8518, i=1
ppid=8518, pid=8519, i=0
ppid=8518, pid=8519, i=1
ppid=8518, pid=8520, i=1
ppid=8519, pid=8521, i=1

从PID上看,一共会出现4个线程(PID,包含主进程)。

输出LOG中,8818是原始线程,共执行2次。8519是主线程第一次循环时产生的子线程,此时i=0,8519也要进行打印。

此时,8818打印了1次,8519打印了一次,共2次打印。

接下来i自增,变为1

8818和8819此时都要进行打印,且都会产生子进程,子进程也要打印,所以最终打印数量为 (8818 + 8520) + (8819 + 8521) = 4次

接下来i自增,变为2,循环结束。

共计6次打印。

不加\n也一样,还是6个-。

=========

你的结果应该会比6个多。这个原因链接中的文章也说了,因为缓冲区。
缓冲区的意思是,你要打印的东西先放到缓冲区里,然后再通过系统调用显示到屏幕上。主进程待打印数据放到了缓冲区里,进行实际输出前,执行了fork,那么缓冲区也被复制了,导致打印出字符的数量变多

【热门文章】
【热门文章】