waitpid()与wait()

转自:http://hi.baidu.com/proudboy_linux/blog/item/2d2926b43fd2d5c736d3ca32.html/cmtid/8994b416b8ac3306c93d6dd1

1. 函数形式:
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);

2. 函数作用:一个进程调用wait类函数表明它要把自己阻塞以等待另一个进程结束(或者其他行为发生)。这样做是为了实现进程间的同步。函数返回结束进程的PID,结束状态保存在指针变量中,主要用来调式程序时获取相关信息。这里的结束状态有两种情况:一是目标进程调用exit(exit_code)正常借宿,那么结束状态就是exit_code的值,二是目标进程收到信号后退出,那么结束状态就是信号对应的整数值。(疑问:如何区分收到的结束状态是exit_code还是信号值?)信号在后面说明。

3. wait()是waitpid()的特例,由于wait()没有pid参数,因此主要用于父子进程的场合。同时wait()也没有options参数,无法指定等待的行为,所以只能等待子进程结束。wait(&status)等同于waitpid(-1, &status, 0)

4. waitpid()的参数说明:
pid参数:
pid > 0,等待PID为pid的进程
pid = 0,等待当前进程的子进程,子进程的PID与调用进程的进程组ID相同
pid =-1,等待任何子进程,相当于wait()
pid < -1, 等待进程组ID为pid绝对值的子进程

options参数:
WNOHANG         变成非阻塞状态,没有子进程则立即退出
WUNTRACED    若子进程处于暂停状态,则马上返回

5. 僵尸进程:名字听起来很酷,但其实没那么厉害。所谓僵尸进程就是子进程退出后(进程调用exit()后其实并没有完全消失,而是留有与之相关的进程信息,主要是为了给系统管理人员提供信息)父进程没有调用wait()进行清理工作,导致在系统进程表里面留下了一个进程的空壳。僵尸进程除了占用一个PID以外基本不占用系统资源,但是过多的僵尸进程会导致PID不够用。如何清理僵尸进程呢?很简单,一个进程如果其父进程终止的话,子进程将会成为孤儿进程被init进程回收,init进程发现它是僵尸进程之后会对其进行清理。也就是说,只要杀死僵尸进程的子进程,就可以清除僵尸进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值