Linux 孤兒程序 殭屍程序 守護程序的解釋

2021-10-05 08:17:43 字數 1257 閱讀 9701

孤兒程序指的是在其父程序執行完成或被終止後仍繼續執行的一類程序。

孤兒程序與殭屍程序是完全不同的,後面會詳細介紹殭屍程序。而孤兒程序借用了現實中孤兒的概念,也就是父程序不在了,子程序還在執行,這時我們就把子程序的ppid設為1。前面講pid提到,作業系統會建立程序號為1的init程序,它沒有父程序也不會退出,可以收養系統的孤兒程序。

作用:

在現實中使用者可能刻意使程序成為孤兒程序,這樣就可以讓它與父程序會話脫鉤,成為後面會介紹的守護程序。

什麼是殭屍程序?

乙個子程序的程序描述符在子程序退出時不會釋放,只有當父程序通過 wait() 或 waitpid() 獲取了子程序資訊後才會釋放。如果子程序退出,而父程序並沒有呼叫 wait() 或 waitpid(),那麼子程序的程序描述符仍然儲存在系統中,這種程序稱之為殭屍程序。

殭屍程序通過 ps 命令顯示出來的狀態為 z(zombie)。

系統所能使用的程序號是有限的,如果產生大量殭屍程序,將因為沒有可用的程序號而導致系統不能產生新的程序。

要消滅系統中大量的殭屍程序,只需要將其父程序殺死,此時殭屍程序就會變成孤兒程序,從而被 init 所收養,這樣 init 就會釋放所有的殭屍程序所占有的資源,從而結束殭屍程序

我們可以認為守護程序就是後台服務程序,因為它會有乙個很長的生命週期提供服務,關閉終端不會影響服務,也就是說可以忽略某些訊號。

實現守護程序:

一、首先要保證程序在後台執行,可以在啟動程式後面加&,當然更原始的方法是程序自己fork然後結束父程序。

if

(pid=

fork()

)

然後是與終端、程序組、會話(session)分離。每個程序建立時都繫結乙個終端,而且屬於乙個程序組(程序組也有gid不過等同程序組長的pid),這些程序組在乙個會話中,如果是子程序一般會從父程序繼承這些資訊,想要與環境分離可以使用以下的系統呼叫。

setsid()

;

同樣地我們會從父程序繼承檔案掩碼(mask),可以手動清理掩碼。

umask(0

);

如果需要我們可以改變當前工作目錄,避免執行時必須使用當前所在的檔案系統。

二、使用nohup

前面提到過nohup命令,是讓程式以守護程序執行的方式之一,程式執行後忽略sighup訊號,也就說關閉終端不會影響程序的執行。類似的命令還有disown。

孤兒程序 殭屍程序 守護程序

1.孤兒程序 如果父程序先退出,子程序還沒退出,那麼子程序將被託孤給init程序 1號程序 這時子程序的父程序就是init程序 1號程序 其實還是很好理解的.2.殭屍程序 如果我們了解過linux程序狀態及轉換關係,我們應該知道程序這麼多狀態中有一種狀態是僵死狀態,就是程序終止後進入僵死狀態 zom...

Linux 殭屍程序 孤兒程序 守護程序簡介

linux程序簡介 pid t fork void pid t 在linux中被定義為 int 示例 include include include intmain printf father process.d n i 兩次執行這條print,i值不同,因為已經有了不同的位址空間。return0 ...

程序特例 殭屍程序 孤兒程序 守護程序

殭屍程序 子程序結束,父程序尚未呼叫wait 子程序資源,子程序的pcb還殘留在核心,造成資源的浪費 孤兒程序 父程序先於子程序結束,子程序成為孤兒程序,子程序修改pcb使其父程序為init程序,孤兒程序結束後,由init程序負責 其pcb資源 守護程序 daemon process 是linux中...