wait 函数

wait(等待子进程中断或结束)
相关函数 waitpid,fork
表头文件
#include
#include
定义函数 pid_t wait (int * status);
函数说明
wait()会暂时停止目前进程的执行,直到有信号来到或子进程结
束。如果在调用wait()时子进程已经结束,则wait()会立即返
回子进程结束状态值。子进程的结束状态值会由参数status 返回,
而子进程的进程识别码也会一快返回。如果不在意结束状态值,则
参数status 可以设成NULL。子进程的结束状态值请参考waitpid()。
返回值
如果执行成功则返回子进程识别码(PID),如果有错误发生则返回
-1。失败原因存于errno 中。
附加说明
范例
#include
#include
#include
#include
main()
{
pid_t pid;
int status,i;
if(fork()= =0){
printf(“This is the child process .pid =%d\n”,getpid());
exit(5);
}else{
sleep(1);
printf(“This is the parent process ,wait for child...\n”;
pid=wait(&status);
i=WEXITSTATUS(status);
printf(“child’s pid =%d .exit status=^d\n”,pid,i);
}
}
执行
This is the child process.pid=1501
This is the parent process .wait for child...
child’s pid =1501,exit status =5
waitpid(等待子进程中断或结束)
相关函数 wait,fork
表头文件
#include
#include
定义函数 pid_t waitpid(pid_t pid,int * status,int options);
函数说明
waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程
结束。如果在调用wait()时子进程已经结束,则wait()会立即
返回子进程结束状态值。子进程的结束状态值会由参数status 返回,
而子进程的进程识别码也会一快返回。如果不在意结束状态值,则
参数status 可以设成NULL。参数pid 为欲等待的子进程识别码,
其他数值意义如下:
pid0 等待任何子进程识别码为pid 的子进程。
参数option 可以为0 或下面的OR 组合:
WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以
等待。
WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束
状态不予以理会。
子进程的结束状态返回后存于status,底下有几个宏可判别结束情
况:
WIFEXITED(status)如果子进程正常结束则为非0 值。
WEXITSTATUS(status)取得子进程exit()返回的结束代码,一
般会先用WIFEXITED 来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为

WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般
会先用WIFSIGNALED 来判断后才使用此宏。
WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为
真。一般只有使用WUNTRACED 时才会有此情况。
WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先
用WIFSTOPPED 来判断后才使用此宏。
返回值
如果执行成功则返回子进程识别码(PID),如果有错误发生则返回
-1。失败原因存于errno 中。
范例
参考wait()。
### 关于 `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){}` 方式逐一清除它们. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值