Linux实现孤儿进程和僵尸进程
孤儿进程:
子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。当一个父进程由于正常完成工作而退出或由于其他情况被终止,它的一个或多个子进程却还在运行,那么那些子进程将成为孤儿进程。为避免孤儿进程退出时无法释放所占用的资源而僵死,进程号为1的init进程将会接受这些孤儿进程,这一过程也被称为“收养”
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main() {
pid_t pid;
pid=fork();
//如果子进程创建失败,直接返回,并打印fork函数错误
if(pid==-1) {
printf("fork err\n");
return 0;
}
//如果是子进程让子进程死循环执行命令
if(pid==0) {
while(1) {
sleep(1);
printf("hello world\n");
}
}
//父进程直接死亡
if(pid>0) {
return 0;
}
return 0;
}
僵尸进程:
一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
int main() {
//使用fork函数复制出一个子进程
pid_t pid=fork();
//如果子进程创建失败,直接打印函数错误,返回
if(pid==-1) {
printf("fork err\n");
return 0;
}
//如果是子进程,让子进程直接死亡
if(pid==0) {
return 0;
}
//如果是父进程,让父进程死循环执行命令,没有时间去释放子进程的pcb
if(pid>0) {
while(1) {
sleep(1);
printf("------hello world------\n");
}
}
return 0;
}