连续fork与分开fork的最形象化解释

20 篇文章 2 订阅
一.说明:

   1. 首先我们要知道一点,使用fork()函数创建子进程是父进程的一个复制品,子进程执行fork后面的程序,前面的程序不会去执行。
   2. 这里主要说明的是,fork()函数会把父进程当前变量的值及fork()后面的代码段复制给子进程。

二.连续fork:
  1. 这里为了方便观察进程列表,使用while(1)让每个进程不退出。
	int main(int argc, const char *argv[])
	{
		pid_t pid1=0,pid2=0;
	    printf("代码段1\n\r");
	    pid1=fork();  
	    pid2=fork();
	    printf("代码段2:进程id=%d,父进程id=%d,pid1=%d,pid2=%d\n\r",getpid(),getppid(),pid1,pid2);
    	while(1);                                                                   
    	return 0;
	}
  1. 程序执行结果
       这里可以看到,代码段1只执行了一次,代码段2执行了4次,当前最小的进程号是父亲进程,父亲进程的父进程号是当前运行这个命令的终端进程号。
      
      
  2. 分析:
       从下面我画的这两张图已经很形象的说明了创建的过程及创建的结果,第一次fork(),子进程“复制”了一份程序并去执行fork下面的程序,这时候只有pid1被改变,pid2没有被改变,第二次fork()时pid1保留上一次fork()被改变的值,pid1不变,只有pid2被赋值改变。阶段1只是个过程,阶段2才是最终的结果。这里需要注意的是,四个进程执行循序按内核调度算法来执行,所以输出的先后结果不一定相同。
      
      
三.分开fork:

   分开fork()与连续fork()的结果是不一样的,第一次fork()完成之后又在父进程第二次fork(),所以分开fork会产生3个进程(包括父进程),而连续fork会产生4个进程(包括父进程)。
  

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值