wait和waitpid函数
#include <sys/wait.h>
int wait(int statloc);
int waitpid(pid_t pid,int *statloc,int option);
两个函数返回值:若成功返回进程ID;若出错返回0或-1;
当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是异步事件,所以这种信号
也是由内核向父进程发送的异步通知。对于这种信号的系统默认动作是忽略它。
调用wait或waitpid可能会发生:
. 如果其所有子进程都还在运行,则阻塞。
. 如果一个进程已经终止,正等待父进程获取其终止状态,则取得子进程的推出状态立即返回。
. 如果他没有任何子进程,则立即出错返回。
如果一个进程已经终止,并且是一个僵死进程,则wait立即返回并取得该子进程的状态;否则wait使其调用者阻塞,
直到一个子进程终止。如果调用者阻塞而且他有多个子进程,则在某一子进程终止时,wait立即返回。
对于waitpid函数中的pid参数的作用解释如下:
pid==-1 等待任一子进程。这种情况下,waitpid和wait等效
pid>0 等待进程ID与pid相等的子进程
pid==0 等待组ID等于调用进程组ID的任一子进程。
pid<-1 等待进程ID等于pid绝对值的子进程
option参数使我们进一步控制waitpid的操作,此参数或者是0或是下列的常量按位或运算的结果
WCONTINUED 若实现支持作业控制,那么有pid指定的任一子进程在听之后继续。但其状态尚未报告,则
返回其状态
WNOHANG 若由pid指定的子进程并不是立即可用的,则waitpid不阻塞,此时其返回值为0;
WUNTRACED 若实现支持作业控制,而由pid指定的任一子进程已处于停止状态,并且其状态自停止以来
还未报告过,则返回其状态。
waitpid函数提供了wait函数没有的三个功能:
1.waitpid可等待一个特定的进程,而wait则返回任一终止进程的状态。
2.waitpid提供了一个wait的非阻塞版。有时希望获取一个子进程的状态,但不想阻塞
3.waitpid通过WUNTRACED和WCONTINUED选项支持作业控制
wait函数例子:
#include "unix.h" #include <sys/wait.h> int main() { pid_t pid; int stat; if((pid=fork())<0) printf("fork error\n"); else if(pid==0) /*子进程*/ exit(3); if(wait(&stat)!=pid) /* 父进程阻塞于此,等待子进程终止 */ printf("wait errorn\n"); printf("process %d exit code: %d\n",pid,stat); return 0; }
waitpid函数例子:
void sig_chld(int signo)
{
pid_t pid;
int stat;
while((pid=waitpid(-1,&stat,WNOHANG))>0) /* -1 等待任一子进程,pid进程退出状态保存在stat中,WNOHANG让等待不阻塞调用进程 */
printf("child %d terminated\n",pid);
return;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)