努力学习Day24【Linux进程】

父进程等待子进程的退出并收集子进程退出状态:

程序的退出我们可以分为两种,异常退出,正常退出。正常退出即程序完成,有一个程序的结束代码,例如exit;那么异常退出的可能是哪些呢?人为杀死,abort……

子进程退出不被收集会变成僵尸状态:

当子进程结束之后父进程任然在运行,这时候我们查看子进程状态 

这个时候我们可以看到我们的进程newpro中,上面父进程(pid=3279)还在运行,而下面结束的子进程(pid=3280)却还在,虽然他“死了”,Z+代表的zombie也就是僵尸 

我们需要学一个函数wait,我们使用man 命令去查看如何使用:

话不多说我们来看一下代码来结合比较好理解如何使用: 

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

int main()
{
    int times;
    times==0;
    pid_t pid;
    pid=vfork();
    if(pid>0)
    {
    wait(NULL);    //改变得地方在这 
        while(1){
    printf("this is father pid,pid=%d\n",getpid());
    sleep(1);
}
    }

    if(pid==0)
    {
        while(1){
    printf("this is child pid,pid=%d\n",getpid());
    sleep(1);
    times++;
    if(times>3){exit(0);break;}
}
    }


    return 0;
}

再看我们的后台,就没僵尸进程了不会给服务器添加杂程序的冗余 

那么如何收集退出状态呢?

我们就这么写代码:


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

int main()
{
	int status =10;



	pid_t pid;
	pid=vfork();

	if(pid>0)
	{
	wait(&status);
		printf("child project is end,father project is begin, status=%d\n",status);		
		while(1){
	printf("this is father pid,pid=%d\n",getpid());
	sleep(1);
}
	}

	else if(pid==0)
	{
				
			while(1){				
				printf("this is child pid,pid=%d\n",getpid());
				sleep(1);
				exit(0);
					}
			}



	return 0;
}

我们来看看运行结果:

status=0即子程序结束开始父进程! 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值