殭屍程式和孤兒程式

打的好啊__發表於2020-12-27

孤兒程式

概念
若子程式的父程式已經死掉,而子程式還存活著,這個程式就成了孤兒程式。
為了保證每個程式都有一個父程式,孤兒程式會被init程式領養,init程式成為了孤兒程式的養父程式,當孤兒程式退出之後,由init程式完成對孤兒程式的回收。

//孤兒程式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
	//建立子程式
	pid_t pid = fork();
	if(pid<0) //fork失敗的情況
	{
		perror("fork error");
		return -1;
	}
	else if(pid>0)//父程式
	{
		sleep(5);
		printf("father: [%d], pid==[%d], fpid==[%d]\n", pid, getpid(),getppid());
	}
	else if(pid==0) //子程式
	{
		
		printf("child: pid==[%d], fpid==[%d]\n", getpid(), getppid());
		sleep(20);
		printf("child: pid==[%d], fpid==[%d]\n", getpid(), getppid());
	}

	return 0;
}

殭屍程式

概念
若子程式死了,父程式還活著, 但是父程式沒有呼叫wait或waitpid函式完成對子程式的回收,則該子程式就成了殭屍程式。

解決方案
由於殭屍程式是一個已經死亡的程式,故不能使用kill命令將程式殺死;
可以通過殺死父程式的方法消除殭屍程式:
殺死其父程式,這個殭屍程式會被init程式領養,由init程式完成對殭屍程式的回收。

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

int main()
{
	//建立子程式
	pid_t pid = fork();
	if(pid<0) //fork失敗的情況
	{
		perror("fork error");
		return -1;
	}
	else if(pid>0)//父程式
	{
		sleep(100);
		printf("father: [%d], pid==[%d], fpid==[%d]\n", pid, getpid(),getppid());
	}
	else if(pid==0) //子程式
	{
		printf("child: pid==[%d], fpid==[%d]\n", getpid(), getppid());
	}
	
	return 0;
}

相關文章