设为首页 加入收藏

TOP

6进程原语:wait()和waitpid()函数(一)
2015-07-20 17:38:54 来源: 作者: 【 】 浏览:5
Tags:进程 wait waitpid 函数
??

1 wait/waitpid

僵尸进程: 子进程退出,父进程没有回收子进程资源(PCB),则子进程变成僵尸进程

孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为1号

进程init进程,称为init进程领养孤儿进程

2依赖的头文件

#include

#include

3函数声明

pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, intoptions);

The value of pid can be:

< -1 meaning wait for anychild process whose process group ID is

equal to the absolute value ofpid.

-1 meaning wait for any childprocess.

0 meaning wait for any child process whose process group ID is

equal to that of the callingprocess.

> 0 meaning wait for thechild whose process ID is equal to the

value of pid.

< -1 回收指定进程组内的任意子进程

-1 回收任意子进程

0 回收和当前调用waitpid一个组的所有子进程

> 0 回收指定ID的子进程

3.说明:

一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还

保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止

则保存着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid获取这

些信息,然后彻底清除掉这个进程。我们知道一个进程的退出状态可以在Shell中用特殊变

量$?查看,因为Shell是它的父进程,当它终止时Shell调用wait或waitpid得到它的退出状

态同时彻底清除掉这个进程。

如果一个进程已经终止,但是它的父进程尚未调用wait或waitpid对它进行清理,这时

的进程状态称为僵尸(Zombie)进程。任何进程在刚终止时都是僵尸进程,正常情况下,僵

尸进程都立刻被父进程清理了,为了观察到僵尸进程,我们自己写一个不正常的程序,父进

程fork出子进程,子进程终止,而父进程既不终止也不调用wait清理子进程:

#include

#include

int main(void)

{

pid_t pid=fork();

if(pid<0) {

perror("fork");

exit(1);

}

if(pid>0) { /* parent */

while(1);

}

/* child */

return 0;

}

若调用成功则返回清理掉的子进程id,若调用出错则返回-1。父进程调用wait或

waitpid时可能会:

* 阻塞(如果它的所有子进程都还在运行)。

* 带子进程的终止信息立即返回(如果一个子进程已终止,正等待父进程读取其终止信

息)。

* 出错立即返回(如果它没有任何子进程)。

这两个函数的区别是:

* 如果父进程的所有子进程都还在运行,调用wait将使父进程阻塞,而调用waitpid时如果在options参数中指定WNOHANG可以使父进程不阻塞而立即返回0。

* wait等待第一个终止的子进程,而waitpid可以通过pid参数指定等待哪一个子进程。

可见,调用wait和waitpid不仅可以获得子进程的终止信息,还可以使父进程阻塞等待子进

程终止,起到进程间同步的作用。如果参数status不是空指针,则子进程的终止信息通过

这个参数传出,如果只是为了同步而不关心子进程的终止信息,可以将status参数指定为

NULL。

例waitpid

\

The value of options is an OR of zero or mZ??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcmUgb2YgdGhlIGZvbGxvd2luZyBjb26pXDwvcD4KCjxwPiAgICAgIHN0YW50czo8L3A+Cgo8cD4gICAgICBXTk9IQU5HICAgIApyZXR1cm4gaW1tZWRpYXRlbHkgaWZubyBjaGlsZCBoYXMgZXhpdGVkLjwvcD4KCjxwPiAgICAgIFdVTlRSQUNFRCAgCmFsc28gcmV0dXJuIGlmIGEgY2hpbGRoYXMgIHN0b3BwZWQgIAooYnV0IG5vdCAgdHJhY2VkICAKdmlhPC9wPgoKPHA+ICAgICAgICAgICAgICAgICAgCnB0cmFjZSgyKSkuICAgU3RhdHVzIGZvciB0cmFjZWQgY2hpbGRyZW4gd2hpY2ggaGF2ZXN0b3BwZWQ8L3A+Cgo8cD4gICAgICAgICAgICAgICAgICAKaXMgcHJvdmlkZWQgZXZlbiBpZiB0aGlzb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQuPC9wPgoKPHA+ICAgICAgV0NPTlRJTlVFRCAoc2luY2UgTGludXggMi42LjEwKTwvcD4KCjxwPiAgICAgICAgICAgICAgICAgIAphbHNvIHJldHVybiBpZiBhIHN0b3BwZWRjaGlsZCBoYXMgYmVlbiByZXN1bWVkIGJ5IGRlbGl2ZXJ5PC9wPgoKPHA+ICAgICAgICAgICAgICAgICAgCm9mIFNJR0NPTlQuPC9wPgoKPHA+ICAgICAgKEZvciBMaW51eC1vbmx5IG9wdGlvbnMsIHNlZSBiZWxvdy4pPC9wPgoKPHA+SWYgc3RhdHVzIGlzIG5vdCBOVUxMLCB3YWl0KCkgYW5kIHdhaXRwaWQoKXN0b3JlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbjwvcD4KCjxwPiAgICAgIHRoZSBpbnQgdG8gd2hpY2ggaXQgcG9pbnRzLiAKVGhpc2ludGVnZXIgY2FuICBiZSAgaW5zcGVjdGVkIHdpdGggCnRoZTwvcD4KCjxwPiAgICAgIGZvbGxvd2luZyAKbWFjcm9zICAod2hpY2ggdGFrZSB0aGUgaW50ZWdlciBpdHNlbGYgYXMgYW5hcmd1bWVudCwgbm90IGE8L3A+Cgo8cD4gICAgICBwb2ludGVyIHRvIGl0LCBhcyBpcyBkb25lIGluIHdhaXQoKSBhbmQgd2FpdHBpZCgpISk6PC9wPgoKPHA+IDwvcD4KCjxwPiAgICAgIFdJRkVYSVRFRChzdGF0dXMpPC9wPgoKPHA+ICAgICAgICAgICAgIApyZXR1cm5zIHRydWUgaWYgdGhlIGNoaWxkdGVybWluYXRlZCBub3JtYWxseSwgdGhhdCBpcywgYnkgY2FsbKlcPC9wPgoKPHA+ICAgICAgICAgICAgIAppbmcgZXhpdCgzK

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU-5031-Lines(DFS) 下一篇HDU 1565 方格取数(1) (状态压缩..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·数据库:推荐几款 Re (2025-12-25 12:17:11)
·如何最简单、通俗地 (2025-12-25 12:17:09)
·什么是Redis?为什么 (2025-12-25 12:17:06)
·对于一个想入坑Linux (2025-12-25 11:49:07)
·Linux 怎么读? (2025-12-25 11:49:04)