一、fork函数是什么

  fork函数将运行着的程序分成2个(几乎)完全一样的进程。如下图:

  进程1在进程关系中我们称之为父进程,进程2就是通过fork产生的,我们叫他子进程。这两个进程在fork执行完之后继续独立进行,但是子进程的fork返回值为0,父进程的fork返回值为子进程的pid(进程id,在PCB中定义),知道了这些,我们现在研究一些关于fork的简单代码。

a:

  如上图,最终输出结果是什么呢?

  

  

  
  执行if(fork() || fork())这一句时,先fork第一个进程(取名进程1),原进程与新进程1同时进行,原进程的fork()返回值"!0",所以打印A。进程1的fork()返回值为0,所以判断或语句的后一个fork(),进程1fork一个进程(取名进程2),此时进程1、2、也同时运行。进程1的fork()返回值为"!0",所以打印A。进程2的fork()返回值为0,所以打印B。结果为 AAB,但顺序未知。为什么结果未知呢?因为每一个子进程与父进程在fork完成之后都是独立进行互不干扰的,所以不一定谁先结束,但是理论上是父进程快于子进程。

b:

  如上图,最终输出结果是什么呢?

  i=0时进入循环,执行fork,先fork一个子进程(取名进程1),此时原进程打印A,进程1打印B。i=1时,原进程fork一个新进程(取名进程2),此时原进程打印A,进程2进程打印B;同时进程1fork一个新进程(取名进程3),进程1打印A,进程3打印B。打印A或B都是通过fork的返回值来判断的,所以还是那句话:子进程返回0,父进程返回子进程的pid。从而得到结果,三个A,三个B,但是顺序不一定,理由前文已经解释过。

最新文章

  1. Hibernate总结(三)
  2. jsonp跨域问题
  3. SQL 按特定字段值排序
  4. [Spring MVC] - Annotation验证
  5. python 代码片段7
  6. C. Ilya and Sticks
  7. WPF DataGrid绑定一个组合列
  8. 532. K-diff Pairs in an Array
  9. Linux中mongodb定时远程备份
  10. nginx开机启动
  11. Spring 文件上传MultipartFile 执行流程分析
  12. liunx 运维知识一部分
  13. windows wmi
  14. 第一节《Git初始化》
  15. python易错题之lambda 以及 for循环中内嵌函数
  16. Android -- 仿淘宝广告条滚动
  17. 最短路径遍历所有的节点 Shortest Path Visiting All Nodes
  18. 【转】Linux---centos安装配置并挂载NFS
  19. C#.NET常见问题(FAQ)-如何把文本复制粘贴到文本框的光标位置
  20. Python实现汉诺塔问题的可视化(以动画的形式展示移动过程)

热门文章

  1. kong 命令(五)plugin
  2. Linux增加虚拟内存
  3. Java 之 HashMap 集合
  4. linux命令安装docker
  5. /Android/sdk/build-tools/21.1.2/aapt'' finished with non-zero exit value 42
  6. IDEA部署项目到远程服务器
  7. (13)input输入函数
  8. webpack解决单页面路由问题
  9. 深度解析Word2vec
  10. Java多维数组定义以及常见异常