进程(父进程、子进程、init进程)

父进程和子进程、init进程之间的关系

通过上节我们知道,子进程是通过fork()函数创建的,相当于父进程的一个复制品,子进程和父进程除了子进程复制了父进程还有什么关系呢?
1.子进程和父进程属于同一进程组,父进程为进程组组长;
2.父进程退出子进程未退出的情况下,子进程会变成孤儿进程有init进程收养并转为后台进程;
3.子进程退出父进程为退出但父进程未及时进行回收,子进程就会成为僵尸进程;

用通俗的方式来讲:子进程和父进程就如同一家公司开了一家子公司一样,虽然在表面上看两家公司是两个独立的公司,但实际内部子公司是完全复制的父公司,但如果父公司倒闭子公司运行那么他就是一个完全独立直接由国家统一进行管理了(这块不太贴切),如果子公司倒闭但父公司运行但对于子公司倒闭没有及时处理,那么倒闭的子公司就会生一个空壳在那。

用程序来看一下父子进程之间的关系

子进程和父进程属于同一进程组,父进程为进程组组长

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

int main(){

	pid_t pid;

	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()));
		while(1);
	}
	else{
		printf("pareent pid %d pgid %d\n",getpid(),getpgid(getpid()));
		while(1);
	}
}

执行结果

ubuntu-14-zs@ubuntu:~/1024/pid$ ./pid_test2
pareent pid 6197 pgid 6197
chile pid 6198 ppid 6197 pgid 6197

由执行结果可见子进程和父进程自同一个进程组里,父进程为
进程组组长。

父进程退出子进程未退出的情况下,子进程会变成孤儿进程有init进程收养并转为后台进程

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

int main(){

	pid_t pid;

	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()));
		while(1);
	}
	else{
		printf("pareent pid %d pgid %d\n",getpid(),getpgid(getpid()));
		//while(1);
		sleep(5);
		exit(0);
	}
}

运行结果
在这里插入图片描述

经过5秒父进程退出后
在这里插入图片描述
子进程转为后台进程
那么子进程是不是被init收养了呢?
在这里插入图片描述

通过ps命令我们可以发现子进程6309的ppid由6308变成了1985
而pid1985正式init进程
在这里插入图片描述

子进程退出父进程为退出但父进程未及时进行回收,子进程就会成为僵尸进程

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

int main(){

	pid_t pid;

	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()));
		//while(1);
		exit(0);
	}
	else{
		printf("pareent pid %d pgid %d\n",getpid(),getpgid(getpid()));
		while(1);
		}
}

运行结果
在这里插入图片描述由执行结果可见子进程pid 6345 变成了僵尸进程;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值