【本文链接】

http://www.cnblogs.com/hellogiser/p/fork.html

【代码】

下面的代码输出多少个-?

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
    int i;
    ; i++)
    {
        fork();
        printf("-");
    }

;
}

输出8个。

在printf语句加上\n之后呢?

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
    int i;
    ; i++)
    {
        fork();
        printf("-");
    }

;
}

输出6个。

【分析】

fork()系统调用是Unix下以自身进程创建子进程的系统调用,一次调用,两次返回,如果返回是0,则是子进程,如果返回值>0,则是父进程(返回值是子进程的pid),这是众为周知的。
还有一个很重要的东西是,在fork()的调用处,整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区,等等。
所以,上面的那个程序为什么会输入8个“-”,这是因为printf(“-“);语句有buffer,所以,对于上述程序,printf(“-“);把“-”放到了缓存中,并没有真正的输出,在fork的时候,缓存被复制到了子进程空间,所以,就多了两个,就成了8个,而不是6个。

图解如下:

注意:上图中的我用了几个色彩,相同颜色的是同一个进程。于是,我们的pstree的图示就可以成为下面这个样子:(下图中的颜色与上图对应)

这样,对于printf(“-“);这个语句,我们就可以很清楚的知道,哪个子进程复制了父进程标准输出缓中区里的的内容,而导致了多次输出了。(如下图所示,就是我阴影并双边框了那两个子进程)

现在你明白了吧。

【参考】

http://coolshell.cn/articles/7965.html

最新文章

  1. Webform 上传图片加水印
  2. 实践Html5的上传文件
  3. vs默认VS Development Sever和用IIS Web Server的一点差别
  4. java 调用webservice的各种方法总结
  5. jquery-uploadify 上传
  6. SQL中的循环
  7. 应用 Middleware
  8. HttpWebRequest&#39;s Timeout and ReadWriteTimeout — What do these mean for the underlying TCP connection?
  9. CentOS 6.2编译安装Nginx1.2.0+MySQL5.5.25+PHP5.3.13+博客系统WordPress3.3.2
  10. oc语言学习之基础知识点介绍(三):类方法、封装以及继承的介绍
  11. C#编程实现朴素贝叶斯算法下的情感分析
  12. JS怎样将拖拉事件与点击事件分离?
  13. Git提交到多个远程仓库
  14. 3、C#基础 - C# 的 Hello World
  15. 最全 Linux 磁盘管理基础知识全汇总
  16. php解析ini,conf文件
  17. SQL-59 按照salary的累计和running_total,其中running_total为前两个员工的salary累计和,其他以此类推。
  18. charles如何设置弱网
  19. 【VBA】数组定义时,括号内的数值n为最大下标,其长度为n+1
  20. js的Timer方法

热门文章

  1. Jedis 例子(demo)大全
  2. XStream使用总结
  3. linux 下tar 的用法
  4. linux下google chrome浏览器字体修改
  5. git如何撤销合并
  6. SQL Server 2012不支持从SQL Server 2000的备份进行还原
  7. Form表单中method为get和post的区别
  8. vector族函数
  9. Ruby注意事项
  10. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解(转VIII)