首页 > 其他 > 详细

一道常考fork题挖掘

时间:2014-01-22 07:36:08      阅读:381      评论:0      收藏:0      [点我收藏+]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
   
int main(void)
{
   int i;
   for(i=0; i<2; i++){
      fork();
      printf("-");
   }
   
   return 0;
}

输出结果不是6个减号,而是8个,如果你见过此题,当不足为奇。因为,子进程复制了父进程缓冲区——而由于printf没带\n,导致把一个咱的缓冲器给了后代,直到(子)进程结束时才把缓冲区所有内容一起打出来。

为了简化问题,先修改printf语句为: 

printf("ppid=%d, pid=%d, i=%d \n", getppid(), getpid(), i);

我本机得结果如下,

ppid=13678, pid=4116, i=0
ppid=4116, pid=4117, i=0
ppid=13678, pid=4116, i=1
ppid=4116, pid=4118, i=1 
ppid=4116, pid=4117, i=1 
ppid=4117, pid=4119, i=1

可理解为按如下流程执行的(下图中注释格式为“进程号/执行顺序/缓冲区中i的值”)

bubuko.com,布布扣

作为验证,把printf语句改为printf("ppid=%d, pid=%d, i=%d split ", getppid(), getpid(), i);这里的split作为自定义的分隔符。

程序执行输出是

ppid=1406, pid=1407, i=0 split ppid=1407, pid=1408, i=1 split ppid=1406, pid=1407, i=0 split ppid=1406, pid=1407, i=1 split ppid=13678, pid=1406, i=0 split ppid=1406, pid=1409, i=1 split ppid=13678, pid=1406, i=0 split ppid=13678, pid=1406, i=1 split

提示执行图示如下,

bubuko.com,布布扣

此题得解。

扩展:假如for结束条件为i<3呢?数出多少个减号?答案是24个!

一道常考fork题挖掘

原文:http://www.cnblogs.com/zhaoyl/p/3529117.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!