#include
#include
#include
#include
int main (void)
sleep(1);
break;
case -1:
perror("process creation failed.\n");
exit(1);
default:
printf("i am parent process, my pid is %d\n", getpid());
exit(0);
}return
0;}
執行結果為:
在ubuntu的圖形介面中,收養孤兒程序的並非init程序,而是交給了其子程序,所以顯示的父程序id不是1。可以將系統轉到字元介面(alt + shift + f1),再執行程式,會發現其父程序id變為1,即init程序收養了該孤兒程序。回到圖形介面用alt + shift + f7
.
上面說到了孤兒程序,所以再來總結下孤兒程序
與殭屍程序
的區別。
孤兒程序:父程序退出,而其子程序仍在執行,則這些子程序將成為孤兒程序。孤兒程序被init程序收養(程序號為1),並完成對狀態收集工作。就像沒有父母而被收養的孤兒。
殭屍程序:某子程序已退出,而父程序沒有呼叫wait
或waitpid
來獲取子程序的狀態資訊,所以子程序的程序描述符仍儲存在系統中,占用系統資源。就像殭屍,已經died,仍要進行肢體活動。
為什麼會產生殭屍程序呢?
unix為了保證父程序可以得到子程序結束時的狀態資訊,在每個程序退出的時候,核心釋放該程序所有的資源(開啟的檔案,占用的記憶體等),但仍然為其保留一定的資訊(程序號the process id,退出狀態the termination status of the process,執行時間the amount of cpu time taken by the process等)。直到父程序通過wait / waitpid來取時才釋放。因此如果程序不呼叫wait / waitpid
的話, 那麼保留的那段資訊就不會釋放,其程序號就會一直被占用。殭屍程序過多就會導致無可用程序號。(kill等命令只可以殺死正在執行的程序,並不能清除殭屍程序的資訊)
參考資料:
1) 基本步驟:
- 讓程序在後台執行:fork乙個子程序,然後是父程序退出;
- 呼叫setsid建立新對話期,擺脫控制終端等的影響,成為無終端的會話組長;
- 禁止程序重新開啟終端:fork乙個新的子程序,使父程序退出;
- 關閉不需要的檔案描述符,避免浪費系統資源;
- 將當前目錄改為根目錄,防止當前檔案系統不能被拆卸;;
- 將檔案遮蔽字設為0;
- 處理sigchld訊號,設為sig_ign,使子程序結束時不會產生殭屍程序。
#include
#include
#include
#include
#include
#include
#include
#include
#include
int init_daemon(void)
int main (void)
return
0;}
一次呼叫,兩次返回。成功fork後,當前程序**為兩個程序,父程序
和子程序
:一次返回值為0,表示子程序在執行;另一次返回值大於0,表示父程序在執行,返回值即子程序的程序id。程序建立失敗則返回-1. Linux程序控制 一
一 程序識別符號 include pid t getpid void 返回值 呼叫程序的程序id pid t getppid void 返回值 呼叫程序的父程序id uid t getuid void 返回值 呼叫程序的實際使用者id uid t geteuid void 返回值 呼叫程序的有效使用...
Linux 程序控制(一)
計算機作業系統對於併發性和並行性的概念給出的定義是 並行性是指兩個或多個事件在同一時刻發生 併發性是指兩個或多個事件在同一時間段內發生。erlang 之父 joe armstrong 用一張5歲小孩都能看懂的 釋了併發與並行的區別 併發是兩個佇列交替使用一台咖啡機,並行是兩個佇列同時使用兩台咖啡機,...
程序及程序控制
學習程序之前,先了解一下程式 所謂程式就是指編譯好的二進位制檔案,在磁碟上,不占用系統資源 cpu 記憶體.而程序是與作業系統相關,是指在記憶體中執行起來的程式,占用一些系統資源,每當乙個程式執行,就相應產生乙個程序。程序的一些相關資訊被放在乙個叫程序控制塊的資料結構中,稱之為pcb。linux下的...