wait4函数

#包含<sys/types.h>“
#<sys/resource.h>“
#<sys/wait.h>的

pid_t wait4(pid_t PID * 状态,INT 选项,结构什么用处* 什么用处);

描述

就像wait4函数一样()暂停当前进程的执行,直到一个孩子(PID)已经退出,或直到一个信号被发送,其行动是终止当前的进程或调用的信号处理功能。如果一个孩子(如要求通过PID)的通话时间(所谓的“僵尸”进程)已经退出,函数会立即返回。孩子所使用的所有系统资源将被释放。

PID的值可以是:

<-1 

等待任意子进程的进程组ID是PID的绝对值相等。

-1 

等待任何子进程这是相当于调用 WAIT3() 

0 

等待子进程的进程组ID等于调用进程。

> 0 

等待的进程ID,PID值等于为孩子 。

购股权的价值是按位或零个或多个下列常量:

WNOHANG 

如果没有孩子是有等待,立即返回。

WUNTRACED 

返回儿童都停止了,其状态尚未见报道。

如果状态不是NULL就像wait4函数一样() 状态信息存储位置 状态。此状态可以使用下列的宏评价:

注意:这些宏的状态值(一个 整数)作为一个参数-而不是一个指针的值!

WIFEXITED(状态) 

非零如果孩子正常退出。

WEXITSTATUS(状态) 

计算结果为最显著的8位孩子的返回代码,终止,这可能被设置为参数调用exit()的主程序中的return语句作为参数。这个宏只能进行评估,如果 WIFEXITED()返回非零。

WIFSIGNALED(状态) 

返回true,如果子进程退出的信号,因为没有抓到。

WTERMSIG(状态) 

返回导致子进程终止的信号的数量。这个宏只能进行评估,如果 WIFSIGNALED()返回非零。

WIFSTOPPED(状态) 

返回true,如果子进程目前已停止引起的回报,这是唯一可能的,如果完成使用WUNTRACED()调用 。

WSTOPSIG(状态) 

返回导致子进程停止的信号的数量。这个宏只能进行评估,如果WIFSTOPPED() 返回非零。

如果什么用处不是NULL,结构什么用处sys / resource.h文件中定义 ),它指向将充满了会计信息。 有关详细信息,请参阅使用getrusage() 

返回值

如果成功,孩子而退出的进程ID被返回。上的错误,则返回-1(尤其是当没有unwaited的指定种类的子进程存在),或者 0,如果使用WNOHANG(),还没有孩子。在后两种情况下,全局变量errno的设置正确。

错误

ECHILD 

指定没有unwaited的子进程不存在。

ERESTARTSYS 

没有设置一个WNOHANG()和一个畅通的信号或SIGCHILD的被抓。这个错误是由系统调用返回。库接口不允许返回 ERESTARTSYS,但将返回 EINTR

### 关于 `wait` 函数及其变体的使用说明 #### 1. 基本功能描述 `wait()` 和其扩展版本(如 `waitpid`, `wait3`, `wait4`)主要用于父进程等待子进程结束并获取其退出状态。这些函数能够帮助清理僵尸进程,从而释放系统资源[^2]。 #### 2. 主要形式与参数解释 - **`wait(int *status)`**: 这是最简单的形式,父进程会阻塞直到任意一个子进程终止。如果没有任何子进程存在或所有子进程仍在运行,则该调用可能永远不会返回。 - 参数 `*status`: 存储子进程退出时的状态码。可以通过宏如 `WIFEXITED(status)` 和 `WEXITSTATUS(status)` 解析正常退出的具体数值[^2]。 - **`waitpid(pid_t pid, int *status, int options)`**: - 参数 `pid`: 可以指定具体的子进程 ID (`>0`)、当前用户的任何子进程 (`-1`) 或者组内的某些成员 ( `<-1 or ==0` )。 - 参数 `options`: 提供额外的行为控制选项,例如 `WNOHANG`(非阻塞模式) 和 `WUNTRACED`(捕获停止而非仅限退出)[^2]. - **`wait3(int *status, int options, struct rusage *rusage)`** 和 **`wait4(pid_t pid, int *status, int options, struct rusage *rusage)`**: - 它们提供了更详细的统计信息给可选结构体变量 `rusage` 中填充实际使用的 CPU 时间和其他资源消耗数据[^1]. #### 3. 返回值分析 成功情况下,以上各方法均返回所关注到的那个已完成生命周期转换(死亡) 的子进程 PID;失败则返回 `-1` 并设置 errno 表明原因[^2]. #### 4. 实际应用案例 假设我们创建了一个新进程来完成一项耗时任务,那么在其完成后我们需要知道结果如何以及避免成为孤儿进程: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main(){ pid_t child_pid; printf("Parent process starting...\n"); if((child_pid = fork()) == 0){ /* Child Process */ puts("Child is doing work..."); sleep(2); exit(EXIT_SUCCESS); // Simulate some job done. } else{ /* Parent waits for completion of any children processes */ int stat_val; pid_t returned_pid; returned_pid = wait(&stat_val); if(WIFEXITED(stat_val)){ printf("Process %d terminated with code %d.\n",returned_pid,WEXITSTATUS(stat_val)); } return EXIT_SUCCESS; } } ``` #### 5. 错误排查指南 - 如果发现程序卡住可能是由于未正确处理 SIGCHLD 导致无法触发相应的回收逻辑. - 当多次连续启动大量短期存活的小型服务端实例时容易产生过多僵尸记录占用内存空间——建议采用循环配合 `while(waitpid(-1,&st,WNOHANG)>0){}` 方式逐一清除它们. --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值