2022.5.18 Linux——复制进程(fork)和僵死进程

本文详细介绍了Linux中的fork函数,包括其使用方法和示例,展示了如何创建子进程并打印不同数量的A。接着讨论了僵死进程的概念,当子进程先于父进程结束而父进程未调用wait时,会产生僵死状态。解决僵死进程的方法是父进程调用wait函数。最后探讨了父进程先结束时子进程会成为孤儿进程,被init进程收养的情况。
摘要由CSDN通过智能技术生成

1 复制进程fork

1.1 fork方法

首先用Linux系统上的帮助手册,查看fork用法,即如下图:
在这里插入图片描述
pid_t fork(void);
函数返回类型pid_t实质上是int类型,Linux内核2.4.0版本定义的是:
在这里插入图片描述
总结:调用fork函数后,实际上会新生成一个进程,调用fork函数的进程为父进程,新生成的进程为子进程。在父进程中返回子进程的pid,在子进程中返回0,如果失败的话返回-1。
代码演示:
在这里插入图片描述
代码分析:在当前进程中,通过调用fork后,产生一个子进程,然后通过获取其pid值,打印对应的子进程还是父进程,注意,父进程打印的pid是不为0的,而子进程打印的pid为0。
运行结果:

1.2 fork练习

例1:可以打印出来几个A?
在这里插入图片描述
运行结果:
在这里插入图片描述
分析:程序在运行时,先是i=0时,执行一次for循环,代码执行一次,调用fork函数,产生一个子进程,然后父进程与子进程各自打印一个A,然后i++后,i变为1,父进程先打印一个A,调用fork再产生一个A,而子进程也是,将i由0变为1,自身打印一个A,再通过fork调用后打印一个A,那么就是6个A。
在这里插入图片描述
例2:可以打印出来几个A?
在这里插入图片描述
运行结果:
在这里插入图片描述
分析:在语句printf(“A”),注意后面没有\n,这就要想到之前所学的printf输出函数,在程序还没有结束之前,printf会将输出的内容放到缓冲区中;所以在i=0时,父进程通过调用fork函数后,父子进程各打印一个A,注意,这个A是留在缓冲区的,i由0变为1时,父子进程分别调用fork后再各自分别产生一个子进程,父子进程自身各打印一个A,产生的子进程再各自打印一个A(打印的A和缓冲区的A加起来是2个),因此,这个程序打印出来有8个A。
在这里插入图片描述
例3:可以打印出来几个A?
在这里插入图片描述
运行结果:
在这里插入图片描述
例4:可以打印出来几个A?
在这里插入图片描述

2 僵死进程及处理方法

2.1 僵死进程概念

僵死进程的概念:子进程先于父进程结束,父进程没有调用wait函数获取子进程退出码。
给一个僵死进程的代码,有
在这里插入图片描述
运行结果:
在这里插入图片描述
分析:从运行结果可以看出,当子进程结束后,并没有消失,仍然在系统中可以看到,但此时子进程的程序其实已经运行结束了,这时候子进程的状态称为僵死状态,系统将处于这种状态的进程称为僵死进程。如果父进程先结束,子进程最后是不会变为僵死进程的。

2.2 处理僵死进程的方法

上述情况,通过调用fork后,我们可以看到子进程先于父进程结束,但是实际中,如果我们不处理僵死进程,那么内存会被占用,因此,为了节省内存空间,必须处理进程中的僵死进程。
处理僵死进程方法:父进程通过调用wait( )完成。
只需要在上述代码中,调用wait函数。
代码:
将上述else代码替换为:
在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述

2.3 如果父进程先于子进程结束,会发生什么?

如果父进程先于子进程结束,子进程会变成一个孤儿进程,init进程会去收养孤儿进程,这时,init pid==1,或者不是1,是其他数字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值