父进程回收子进程之wait()函数使用解读

1、wait的工作原理

(1)子进程结束时,系统向其父进程发送SIGCHILD信号

(2)父进程调用wait函数后阻塞

(3)父进程被SIGCHILD信号唤醒,然后去回收僵尸子进程

(4)父子进程之间是异步的,SIGCHILD信号机制就是为了解决父子进程之间的异步通信问题,让父进程可以及时的去回收僵尸子进程

(5)若父进程没有任何子进程则wait返回错误。

 

2、参数解读

(1)wait的参数status。

  • status用来返回子进程结束时的状态,父进程通过wait得到status后就可以知道子进程的一些结束状态信息。

(2)wait的返回值pid_t。

  • 这个返回值就是本次wait回收的子进程的PID。当前进程有可能有多个子进程,wait函数阻塞直到其中一个子进程结束wait就会返回,wait的返回值就可以用来判断到底是哪一个子进程本次被回收了。

(3)小结:wait主要是用来回收子进程资源,回收同时还可以得知被回收子进程的pid和退出状态。

(4)WIFEXITED、 WIFSIGNALED、 WEXITSTATUS这几个宏用来获取子进程的退出状态。

  • WIFEXITED宏用来判断子进程是否正常终止(return、exit、_exit退出)。
  • WIFSIGNALED宏用来判断子进程是否非正常终止(被信号所终止)。
  • WEXITSTATUS宏用来得到正常终止情况下的进程返回值。

 

3、fork后wait回收编程实例

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void)
{
	pid_t p1 = -1;
	pid_t ret = -1;
	int status = 0;
	
	p1 = fork();	//返回2次
	
	if(p1 == 0)
	{
		//这里一定是子进程
		printf("子进程,pid = %d.\n", getpid());
	}
    else if(p1 > 0)
	{
		//这里一定是父进程
		printf("parent.\n");
		ret = wait(&status);
		
		printf("子进程已经被回收,子进程pid = %d.\n", ret);
		printf("子进程是否被正常回收: %d.\n", WIFEXITED(status));
	}

	else 
	{
		//这里一定是fork出错了
		perror("fork");
		return -1;
	} 
	
	return 0;
}

 

4、wait和waitpd差别

(1)基本功能一样,都是用来回收子进程的

(2)waitpid可以回收指定PID的子进程

(3)waitpid可以阻塞或者非阻塞两种工作模式。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xw-何妨吟啸且徐行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值