进程(进程回收)

进程回收

通过上节我们知道子进程退出后如果父进程不及时回收子进程会变成僵尸进程,那么父进程怎么回收已退出的子进程呢?

wait()和waitpid()函数

wait()函数

函数原型 pid_t wait( int *status);
ret: 成功:已回收进程的pid;
失败:-1;
功能:使用于父进程,等待(阻塞)一个子进程结束或该进程接到了一个指定的信号为止;
如果该父进程没有子进程或子进程已结束,那么wait()会返回-1;

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

int main(){

	pid_t pid,ret;

	pid = fork();

	if(pid < 0){
		perror("fork");
		return 0;
	}
	else if(pid == 0){
		printf("chile pid %d ppid %d pgid %d\n",getpid(),getppid(),getpgid(getpid()));
		sleep(5);
		//while(1);
		exit(0);
	}
	else{
		printf("pareent pid %d pgid %d\n",getpid(),getpgid(getpid()));
		ret = wait(NULL);
		if(ret == -1){
		printf("wait is failed\n");
		}
		else{
		printf("wait pid:%d\n",ret);
		}
		while(1);
		}
}

执行结果
在这里插入图片描述
在这里插入图片描述
由执行结果可见,利用wait()回收子进程后,就不会出现上节中出现的子进程成为僵尸进程情况了
在这里插入图片描述

waitpid()函数

函数原型 pid_t waitpid(pid_t pid,int *status,int option);
ret: >0:回收子进程的进程号;
=0:options 设置为WNOHANG且子进程没有退出;
-1:出错;
各参数功能:pid_t pid:pid > 0:回收进程号等于pid的子进程;
pid = -1:回收任何一个子进程;
pid = 0:回收其组id等于调用进程的组id的任何一个进程;
pid < -1:回收其组id等于pid的绝对值的任意子进程;
options: WNOHANG:若指定的pid没有退出不等待(阻塞)立即返回,返回值为0;
WUNTRACED:为了实现某种操作,有pid指定一个子进程已被暂停, 且
其状态还未报告过,则返回其状态;
0:和wait()一样;
当waitpid(-1,NULL,0)时作用与wait()一样。

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

int main(){

	pid_t pid,ret;

	pid = fork();

	if(pid < 0){
		perror("fork");
		return 0;
	}
	else if(pid == 0){
		printf("chile pid %d ppid %d pgid %d\n",getpid(),getppid(),getpgid(getpid()));
		sleep(5);
		//while(1);
		exit(0);
	}
	else{
		printf("pareent pid %d pgid %d\n",getpid(),getpgid(getpid()));
		ret = waitpid(-1,NULL,0);
		if(ret == -1){
		printf("wait is failed\n");
		}
		else{
		printf("wait pid:%d\n",ret);
		}
		while(1);
		}
}

执行结果
在这里插入图片描述在这里插入图片描述
执行结果与wait()相同;
wait()是waitpid()的一个特例;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值