殭屍程序,孤兒程序及程式碼實現
阿新 • • 發佈:2018-12-09
殭屍程序
父程序呼叫fork()建立子程序,通常情況下,子程序執行時,父程序呼叫wait()或waitpid()函式等待子程序,子程序退出後,父程序接收到子程序的退出碼,並釋放子程序資源。 但如果父程序沒有接收到子程序的退出碼,那子程序的資源便無法回收,子程序將會以終止狀態保持在程序表中,直到父程序讀取它的退出碼,這種子程序也就叫殭屍程序。
殭屍程序的危害
1.殭屍程序雖然已經不再工作,但它自己那部分資源卻未得到釋放,會造成記憶體洩漏 2.計算機能夠執行的程序是有限的,殭屍程序過多將導致新程序無法建立 3.殭屍程序一直保持退出狀態,這是需要task_struct維護的,有一定開銷。
模擬實現殭屍程序
//模擬一個持續30s的殭屍程序
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4
5
6 int main()
7 {
8 pid_t pid = fork();//建立一個子程序
9
10 if (pid<0)//建立子程序失敗
11 {
12 printf("create child process is failed!!\n");
13 }
14
15 else if (pid >0)//父程序
16 {
17 printf("parent process is sleeping:%d\n",getpid());
18 sleep(30);
19 }
20 else//子程序
21 {
22 printf("this is child process");
23 sleep(5);
24 exit(EXIT_SUCCESS);
25 }
26 return 0;
27
28 }
執行上面的程式碼,我們用ps -aux檢視一下程序的狀態:
孤兒程序
當父程序先於子程序退出,子程序就成為孤兒程序,子程序會被孤兒院init程序領養(意為init程序作為子程序的新父程序),由init程序為他回收資源。
程式碼實現
1 #include<stdio.h>
2 #include<stdlib.h>
3
4
5 int main()
6 {
7 pid_t pid = fork(); //建立子程序
8 if (pid < 0)//建立失敗
9 {
10 printf("fork error!!\n");
11 return -1;
12 }
13 else if (pid >0)//父程序
14 {
15 printf("father is gone!!\n");
16 exit(EXIT_SUCCESS);
17 }
18 else//子程序
19 {
20 printf("my father is gone!! %d\n",getpid());
21 sleep(20);
22 }
23 return 0;
24 }
上述程式碼執行後,結果如下: 我們再來看一下子程序的狀態: 由圖可知,子程序已經被1號程序(init程序)領養,1號程序來為該程序釋放資源。