父进程和子进程、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 变成了僵尸进程;