55_进程之父进程调用wait回收子进程

子进程结束时,OS回向父进程发送一个SIGCHILD信号,关于信号会在下一个课程讲解, 

父进程调用wait阻塞,wait是阻塞式的,父进程调用wait会被阻塞住,父进程调用wait就会一直在这里等SIGCHILD信号,收到这个信号就说明父进程要去回收僵尸进程了

所以说父子进程是异步的,同步,两个任务在同样的节拍下工作,中断就是异步的,我永远不知道别人是什么状态的,父进程要尽快的回收子进程,所以这个发信号的机制,就是为了解决父子进程之间的异步通信问题,就是让父进程快速回收僵尸子进程。

这是利用信号,使两个异步进程互相通信。

如果父进程没有任何子进程,如果父进程调用wait就会返回错误。父进程不能调用wait,这个机制是很合理的。


status是返回的子进程的结束状态

子进程的结束状态:子进程结束时会有一个返回值,是执行成功了还是失败了,status就知道了子进程是正常结束的还是异常结束的,异常包括Ctrl+c被别人kill的,status的意义就在这,父进程知道子进程挂掉时的状态

PID是进程号,子进程的ID号码,因为一个进程可能会有很多子进程,以示区分,wait阻塞等待,直到有一个子进程返回,因为先结束的哪一个是不知道的,要通过PID告诉父进程

总结:wait主要是用来回收子进程的资源,回收的同时还可以知道子进程的PID和退出状态

wait会交出CPU的使用权,只是在本进程中不会再往下执行了,本进程会卡在这里不往下执行


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

int main(void)
{	
	pid_t pid = -1,ret = -1;
	int status = -1;
	
	pid = fork();
	if(pid < 0)//出错
	{
		perror("fork");
		return -1;
	}
	else if(pid > 0)//父进程
	{
		printf("parent.child PID is %d.\n", pid);//在父进程中取子进程的PID
		ret = wait(&status);
		printf("child was stopped.child PID is %d.\n", ret);
		printf("Returns true if the child terminated normally :%d\n", WIFEXITED(status));
		printf("Returns true if the child process was terminated by a signal. :%d\n", WIFSIGNALED(status));
		printf("returns  the  exit  status  of  the child :%d\n", WEXITSTATUS(status));
		
	}
	else// == 0 子进程
	{
		printf("child.child PID is %d.\n", getpid());//在子进程中,取本进程的PID
		return 88;
	}
	
	return 0;
}












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值