Linux进程控制-2

紧接着上篇博客出发,我们接着来讲述Linux中进程控制的内容。

目录

1.等待

1.1具体操作

1.等待

进程等待主要的作用在于:父进程创建子进程之后,等待子进程退出,获取子进程的退出码,释放子进程的资源,避免僵尸进程的出现。

1.1具体操作

我们来看两个系统调用接口:

pid_t wait(int *status);

wait是一个阻塞接口,功能是等待当前调用者的任意一个子进程退出,获取返回值,释放资源。其中,status是一个int空间的地址,用于向指定空间中存放子进程的推出返回值。(值得注意的是,wait接口只针对一个子进程,不可面向多个。)

对于wait的返回值:成功则返回处理退出的子进程pid,失败则返回-1。

另外,阻塞接口的概念第一次出现在本专栏中,我们趁机对其进行一个简要的解释。

  • 阻塞接口:为了完成一个功能发起了一个调用,但该调用完成条件不具备,则接口一直等待不返回;
  • 非阻塞接口:为了完成一个功能发起了一个调用,但是该调用完成条件不具备,则立即返回并报错。
pid_t waitpid(pid_t pid, int *status, int options);

waitpid接口,既可以等待任意一个子进程退出,也可以等待指定的子进程退出。其中,pid参数:>0-则表示等待指定pid的子进程退出;-1-则表示等待任意一个子进程退出。

waitpid接口既可以阻带等待,也可以使用非阻塞等待。options参数:0-表示默认阻塞等待;WNOHANG-设施为非阻塞等待(当前没有子进程退出则会报错)。

对于waitpid返回值:成功则返回处理退出的子进程pid;若没有子进程退出则返回0;出错返回-1.

对于阻塞操作和非阻塞操作,阻塞操作通常流程相较简单,但资源利用率也相较低下,这是由于阻塞接口等待参数时并不做任何的其他操作,仅是等待调用条件完备;

而非阻塞操作流程相对复杂,但是资源利用率高,因为对于非阻塞接口而言,我们通常会加入循环操作来对调用条件进行多次判断,所以流程相较繁琐,但是在调用资源不完备的情况下,不会占用资源,阻碍其他接口对资源的使用。

 

我们对wait接口进行一次实践,我们可以很清晰的看出阻塞接口的特性,即等待调用条件完备在执行,若调用条件一直不完备,则一直等待。并且对于wait的功能,我们也能很明了的看出,对于子进程的退出状况。

值得注意的是,当程序正常退出时,即通过return或exit退出,都会设置有相应的退出码,但是如果程序时运行中产生异常崩溃,则设置的退出码也就没了意义。

所以我们需要对程序的是否异常退出加以控制,即我们需要从status中提取判断进程是否正常退出的关键信息,和相对应的退出码。

此时,我们就需要了解一下status中每一个比特位的具体设置,status作为整形数据,由32位比特位构成,其中高16位我们先不关心,对于低16位中的高8位存储的是保存进程退出码,接下来1位作为coredump标志位,剩余7位是信号异常值。

所以当我们判断进程是否正常退出和如何从status中取出退出码,前者可以取status中的低7位(信号异常值)来判断(status & 0x7f),后者则取出低16位中的高8位(进程退出码)((status >> 8) & 0xff) 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值