加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux中wait与waitpid的差别

发布时间:2013-10-29 11:03:23 所属栏目:Linux 来源:站长网
导读:zombie不占用内存也不占用CPU,表面上我们可以不用在乎它们的存在,然而事实上UNIX系统限制了某一时刻能同时存在的进程的最大数目。如果程序不及时清理系统中的
zombie不占用内存也不占用CPU,表面上我们可以不用在乎它们的存在,然而事实上UNIX系统限制了某一时刻能同时存在的进程的最大数目。如果程序不及时清理系统中的zombie,最终会导致进程数过多,当再次需要产生新进程时就会出错。

鉴于上边的原因,我们需要在子进程调用exit后在父进成中调用wait或waipid

#include<sys/types.h>

#include<sys/wait.h>

pid_t wait(int &statloc);

pid_t waitpid(pid_t pid,int *statloc, int options);

Both return:process ID if OK,-1 on error

它们被父进程调用以获取子进程结束信息、清除zombie。当父进成调用这两个函数时

a 阻塞(如果它的子进程还在运行)

b 立即返回子进程结束信息(如果一个子进程已经结束并等待父进程获取信息)

c 返回错误(如果不存在子进程)

两个函数的不同在于wait会令调用者阻塞直至某个子进程终止而waitpid则可以通过设置一个选项来设置为非阻塞,另外waitpid并不是等待第一个结束的进程而是等待参数中pid指定的进程。

  两个函数中的变量statloc是一个指向int型数据的指针。如果此变量不是NULL,则结束的进程的termination status会被保存在statiloc所指向的内存的区域;如果我们不关心termination status,则可以把statloc置为NULL。

  传统的实现中这两个函数返回的整数中特定的比特位被赋予了特定的含义。POSIX.1指定了一些包含在头文件<sys/wait.h> 宏来查看这些termination status

     Macro                                        Description

WIFEXITED(status)                     如果status是由一个正常结束的进程产生的则值为真,此时我们可以继续使用宏WEXITSTATUS(status)来获取exit或_exit的参数

  WIFSIGNALED(status)                   如果status是由一个异常结束(接受到一个信号)的进程产生的则值为真,此时使用宏WTERMSIG(status)来获取信号数。

  WIFSTOPPED(status)                    如果status是由一个接受到信号目前终止的进程产生的则值为真,此时可以继续调用宏WSTOPSIG(status)来查看是哪个信号导致进程终止。

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读