waitpid最后以一个参数设为0_第6章 进程控制(3)_wait、exec和system函数

5.等待函数

(1)wait和waitpid

头文件

#include

#include

函数

pid_t wait(int* status);

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

返回值

成功返回子进程ID,出错返回-1

功能

等待子进程退出并回收,防止僵尸进程的产生

参数

(1)status参数:

①为空时,代表任意状态结束的子进程;

②不为空时,则等待指定状态结束的子进程

(2)waitpid的pid参数

①pid == -1 :等待任一子进程,功能与wait等效。

②pid > 0 :等待其进程ID与pid相等的子进程

③pid == 0:等待其组ID等于调用进程的组ID的任一子进程

④pid < -1:等待其组ID等于pid的绝对值的任一子进程。

(3)options参数

①WNOHANG:如果pid子进程未结束则立即返回,不会阻塞,此时返回值为0。如果pid进程己退出,则返回这个进程的pid。

②WUNTRACED:使waitpid报告那些己经被停止的未报告子进程的状态。

备注

wait的waitpid的区别:

①在一个子进程终止前,wait使用调用者阻塞

②waitpid的options可使调用者不阻塞

③waitpid等待一个指定的子进程,而wait等待所有的子进程,返回任一终止子进程的状态。

(2)检查wait和waitpid函数返回的终止状态的宏

判断终止状态

获取终止状态值

说明

WIFEXITED(status)

WEXITSTATUS(status)

判断子进程是否正常终止及获取退出码

WIFSIGNAL(status)

WTERMSIG(status)

判断子进程是否异常终止及获取异常终止的信号编码

WIFSTOPED(status)

WSTOPSIG(status)

判断子进程是否被暂停及获取暂停的信号编码

【编程实验】判断进程的终止状态

//process_wait.c

#include #include#include#include

void out_status(intstatus)

{if(WIFEXITED(status)){

printf("normal exit: %d\n", WEXITSTATUS(status));

}else if(WIFSIGNALED(status)){

printf("abnormal terminate: %d\n", WTERMSIG(status));

}else if(WIFSTOPPED(status)){

printf("Stopped signal: %d\n", WSTOPSIG(status));

}else{

printf("unknow signal\n");<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值