程序控制 一

2021-08-04 05:41:30 字數 1918 閱讀 5099

#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),並完成對狀態收集工作。就像沒有父母而被收養的孤兒。

殭屍程序:某子程序已退出,而父程序沒有呼叫waitwaitpid來獲取子程序的狀態資訊,所以子程序的程序描述符仍儲存在系統中,占用系統資源。就像殭屍,已經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下的...