您的位置:首页 > 大数据 > 人工智能

waitpid()与wait()

2011-10-24 10:03 120 查看
转自: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进程发现它是僵尸进程之后会对其进行清理。也就是说,只要杀死僵尸进程的子进程,就可以清除僵尸进程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: