依然还是我,那个喜欢问面试题的人文专业的少年
头文件已省略
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,那么缓冲区也被复制了,导致打印出字符的数量变多