【Linux】wait函数 和 waitpid函数

在每个进程退出的时候,内核释放该进程所有的资源、包括打开的文件、占用的内存等。但是仍然为其保留一定的信息,这些信息主要值进程控制块PCB的信息,包含自身进程号、父进程号、退出状态、运行时间等。

父进程可以通过调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。

wait()和waitpid()默认情况下都是堵塞等待,waitpid()可以设置不堵塞,还可以指定等待哪个子进程结束。一次wait或waitpid调用只能清理一个子进程,清理多个子进程应该使用循环。

wait函数

       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *status);
       pid_t waitpid(pid_t pid, int *status, int options);

参数:
int *statue :用于获取子进程退出时的状态

返回值:
如果成功,返回被回收的子进程id;如果失败,返回-1 。

退出信息相关宏函数

WIFEXITED(status)非0,进程正常退出
WEXITSTATUS(status)获取进程退出的状态码(exit的参数)

WIFSIGNALED(status)非0,进程异常终止
WTERMSIG(status) 获取使进程终止的信号编号

WIFSTOPPED(status)非0,进程暂停
WSTOPSIG(status)获取使进程暂停的信号编号
WIFCONTINUED(status)非0,进程暂停后继续运行

例子如下。

int state;
int ret = wait(&state);

if(WIFEXITED(state)) {
	//正常退出
	printf("%d\n",WEXITSTATUS(status));	//获取状态码
}

if(WIFSIGNALED(state)) {
	//异常终止
	printf("%d\n",WTERMSIG(status));	//获取信号编号
}

if(WIFSTOPPED(state)){
	//进程暂停
	printf("%d\n",WSTOPSIG(status));	//获取信号编号
}

waitpid函数

       #include <sys/types.h>
       #include <sys/wait.h>

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

参数:
pid_t pid:指定子进程

  • 小于- 1 : 回收某个进程组的进程,进程组id为其绝对值
  • -1 : 等待任何一个子进程
  • 0 : 回收当前进程组的子进程
  • 大于0 : 等待具体某个子进程

int *statue :用于获取子进程退出时的状态
options :0代表阻塞, WNOHANG代表非阻塞(不会挂起)

返回值:
如果成功,返回被回收的子进程id。
如果还有子进程存在,返回0。
如果失败(无子进程存在),返回-1 。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值