linux中父进程等待所有的子进程结束的方法

本文介绍了在多进程程序中如何有效地管理子进程并回收已退出的子进程资源。通过使用wait和waitpid函数,结合SIGCHLD信号处理机制,确保了程序能够正确地处理子进程的结束状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pid_t r_wait(int * stat_loc)
{
	int revalue;
	while(((revalue = wait(stat_loc)) == -1) && (errno == EINTR));//如果等待的过程中被一个不可阻塞的信号终断则继续循环等待
	return revalue;
}

服务退出之前父进程等待子进程的调用方法:

while(r_wait(NULL) > 0);//wait for all the subprocess.


在多进程程序中用于收集已退出进程的方法:


signal(SIGCHLD,sigchld_handler);
void sigchld_handler(int signo)
{
    pid_t pid;
    while((pid = waitpid(-1,NULL,WNOHANG)) > 0)
        cout<<"pid "<<pid<<" exited !"<<endl;
}




### 实现父进程等待子进程结束 为了确保父进程能够正常等待子进程完成并获取其退出状态,在Linux环境中通常使用`wait()`或`waitpid()`函数。这些函数允许父进程暂停执行,直至指定的子进程终止,并从中获得有关子进程的信息。 下面展示了一个简单的C语言代码片段,用于创建一个新进程并通过调用`fork()`分离成父子两个独立的工作单元;随后利用`wait()`让父进程挂起直到接收到子进程结束的通知: ```c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> int main(void){ pid_t child_pid; printf("Parent process starting...\n"); /* 创建一个新的子进程 */ child_pid = fork(); if (child_pid != 0) { // 这里是父进程中... int status; printf("Waiting for the child to complete.\n"); // 调用 wait 函数来阻塞当前线程(这里是父进程),直到某个子进程结束为止。 wait(&status); printf("Child has finished with exit code %d\n", WEXITSTATUS(status)); } else { // ...这里则是子进程中 printf("This is the child process, now sleeping for five seconds.\n"); sleep(5); printf("The child process ends here!\n"); _exit(EXIT_SUCCESS); // 正常退出子进程 } return EXIT_SUCCESS; } ``` 这段代码展示了基本流程:通过`fork()`生成子进程后立即进入不同的分支逻辑处理各自的任务。对于父进程而言,则需调用`wait()`以防止过早结束造成孤儿进程现象的发生以及避免未捕获到子进程的状态信息形成僵尸进程[^1]。 此外,还可以采用更灵活的方式——`waitpid()`来进行特定条件下的等待操作,比如只关注某一个具体的子进程或是设置非阻塞性质等特性。这取决于实际应用场景的需求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值