Linux 殭屍程序與孤兒程序
殭屍程序
產生原因
子程序先於父程序退出,他要保留退出原因在pcb中,因此退出後不會自動釋放所有資源,子程序退出後作業系統會通知父程序,子程序退出了,去獲取一下原因,然後完全釋放子程序資源,假如父程序不管子程序的退出狀態,那麼這個子程序將進入僵死狀態,成為殭屍程序
程式碼實現殭屍程序
//該程式為20秒的殭屍程序,在第10秒時變為殭屍程序,30秒時退出
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
int main()
{
pid_t pid = fork();//建立子程序
if (pid < 0)//fork返回值小於零時是創建出錯
{
perror("fork error");
return -1;
}
else if(pid == 0)//fork返回值為零時,是在子程序中
{
printf("this is child!!\n");
sleep(10);
exit(EXIT_SUCCESS);
}
else//在父程序中,fork的返回值是創建出的子程序的pid
{
printf("this is parent!!\n");
sleep(20);
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
此圖是在程式執行10秒內的程序資訊,可以看出父子程序此時都是S狀態,也就是睡眠態
此圖是程式執行10秒後到20秒內的程序資訊,此時的父程序還是睡眠狀態,而子程序已經變為殭屍態,此時的父程序就是殭屍程序
孤兒程序
產生原因
父程序先於子程序退出
此時父程序變為init程序,也就是說,父程序退出了,init程序將負責釋放資源,init程序非常負責任,因此,孤兒程序不會成為殭屍程序
程式碼實現
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main()
{
pid_t pid = fork();
if (pid < 0)
{
perror("fork error");
return -1;
}
else if (pid > 0)
{
printf("parent %d\n", getpid());
return 0;
}
else
{
sleep(30);
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
此圖為10秒前,此時未成為孤兒程序,父程序pid為4764,子程序pid為4765
從上圖中可以看出父程序已經退出了,pid為4765的程序其父程序的pid為1,也就是其父程序變為init程序,此時已經成為孤兒程序,最終init程序在子程序結束後將負責釋放其資源
---------------------
作者:K_A_Irving
來源:CSDN
原文:https://blog.csdn.net/K_A_Irving/article/details/83792697
版權宣告:本文為博主原創文章,轉載請附上博文連結!