通訊架構實戰 3 7 守護程序詳解 範例演示

2021-10-04 07:58:46 字數 2854 閱讀 9943

一:普通程序執行觀察

ps -eo pid,ppid,sid,tty,pgrp,comm,stat,cmd | grep -e 'bash|pid|nginx'

a)程序有對應的終端,如果終端退出,那麼對應的程序也就消失了;它的父程序是乙個bash

b)終端被佔住了,你輸入各種命令這個終端都沒有反應;

二:守護程序基本概念

守護程序 一種長期執行的程序:這種程序在後台執行,並且不跟任何的控制終端關聯;

基本特點:

a)生存期長[不是必須,但一般應該這樣做],一般是作業系統啟動的時候他就啟動,作業系統關閉的時候他才關閉;

b)守護程序跟終端無關聯,也就是說他們沒有控制終端,所以你控制終端退出,也不會導致守護程序退出;

c)守護程序是在後台執行,不會佔著終端,終端可以執行其他命令

linux作業系統本身是有很多的守護程序在默默的執行,維持著系統的日常活動。大概30-50個;

a)ppid = 0:核心程序,跟隨系統啟動而啟動,宣告週期貫穿整個系統;

b)cmd列名字帶這種,叫核心守護程序;

c)老祖init:也是系統守護程序,它負責啟動各執行層次特定的系統服務;所以很多程序的ppid是init。而且這個init也負責收養孤兒程序;

d)cmd列中名字不帶的普通守護程序(使用者級守護程序)

共同點總結:

a)大多數守護程序都是以超級 使用者特權執行的;

b)守護程序沒有控制終端,tt這列顯示?

核心守護程序以無控制終端方式啟動

普通守護程序可能是守護程序呼叫了setsid的結果(無控制端);

三:守護程序編寫規則

(1)呼叫umask(0);

umask是個函式,用來限制(遮蔽)一些檔案許可權的。

(2)fork()乙個子程序(脫離終端)出來,然後父程序退出( 把終端空出來,不讓終端卡住);固定套路

fork()的目的是想成功呼叫setsid()來建立新會話,目的是

子程序有單獨的sid;而且子程序也成為了乙個新程序組的組長程序;同時,子程序不關聯任何終端了;

--------------講解一些概念

(3.1)檔案描述符:正數,用來標識乙個檔案。

當你開啟乙個存在的檔案或者建立乙個新檔案,作業系統都會返回這個檔案描述符(其實就是代表這個檔案的),

後續對這個檔案的操作的一些函式,都會用到這個檔案描述符作為引數;

linux中三個特殊的檔案描述符,數字分別為0,1,2 

0:標準輸入【鍵盤】,對應的符號常量叫stdin_fileno

1:標準輸出【螢幕】,對應的符號常量叫stdout_fileno

2:標準錯誤【螢幕】,對應的符號常量叫stderr_fileno 

類unix作業系統,預設從stdin_fileno讀資料,向stdout_fileno來寫資料,向stderr_fileno來寫錯誤;

類unix作業系統有個說法:一切皆檔案,所以它把標準輸入,標準輸出,標準錯誤 都看成檔案。

與其說 把   標準輸入,標準輸出,標準錯誤 都看成檔案   到不如說

象看待檔案一樣看待    標準輸入,標準輸出,標準錯誤

象操作檔案一樣操作    標準輸入,標準輸出,標準錯誤

同時,你程式一旦執行起來,這三個檔案描述符0,1,2會被自動開啟(自動指向對應的裝置);

檔案描述符雖然是數字,但是,如果我們把檔案描述符直接理解成指標(指標裡邊儲存的是位址——位址說白了也是個數字);

write(stdout_fileno,"aaaabbb",6);

(3.2)輸入輸出重定向

輸出重定向:我標準輸出檔案描述符,不指向螢幕了,假如我指向(重定向)乙個檔案

重定向,在命令列中用 >即可;

輸入重定向   <

(3.3)空裝置(黑洞)

/dev/null      :是乙個特殊的裝置檔案,它丟棄一切寫入其中的資料(象黑洞一樣);

----

守護程序雖然可以通過終端啟動,但是和終端不掛鉤。

守護程序是在後台執行,它不應該從鍵盤上接收任何東西,也不應該把輸出結果列印到螢幕或者終端上來

所以,一般按照江湖規矩,我們要把守護程序的 標準輸入,標準輸出,重定向到  空裝置(黑洞);

從而確保守護程序不從鍵盤接收任何東西,也不把輸出結果列印到螢幕;

int fd;

fd = open("/dev/null",o_rdwr) ;//開啟空裝置

dup2(fd,stdin_fileno); //複製檔案描述符  ,像個指標賦值,把第乙個引數指向的內容賦給了第二個引數;

dup2(fd,stdout_fileno);

if(fd > stderr_fileno)

close(fd); //等價於fd = null;

(3.4)實現範例

守護程序可以用命令啟動,如果想開機啟動,則需要借助 系統初始化指令碼來啟動。

四:守護程序不會收到的訊號:核心發給你,另外的程序發給你的;

(4.1)sighup訊號

守護程序不會收到來自核心的  sighup 訊號; 潛台詞就是 如果守護程序收到了 sighup訊號,那麼肯定是另外的程序發給你的;

很多守護程序把這個訊號作為通知訊號,表示配置檔案已經發生改動,守護程序應該重新讀入其配置檔案;

4.2)sigint、sigwinch訊號

守護程序不會收到來自核心的  sigint(ctrl+c),sigwinch(終端視窗大小改變) 訊號;

五:守護程序和後台程序的區別

(1)守護程序和終端不掛鉤;後台程序能往終端上輸出東西(和終端掛鉤);

(2)守護程序關閉終端時不受影響,後台程序會隨著終端的退出而退出;

(3)......其他的,大家自己總結;

(C 通訊架構學習筆記) 守護程序及訊號處理實戰

目錄 守護程序功能的實現 訊號處理函式的進一步完善 ngx daemon 函式 int ngx daemon ngx parent ngx pid ngx pid getpid if setsid 1 umask 0 int fd open dev null o rdwr if fd 1 if du...

3 7 守護程序詳解 範例演示

ps eo pid,ppid,sid,tty,pgrp,comm,stat,cmd grep e bash pid nginx a 程序有對應的終端,如果終端退出,那麼對應的程序也就消失了 它的父程序是乙個bash b 終端被佔住了,你輸入各種命令這個終端都沒有反應 守護程序 一種長期執行的程序 這...

和守護程序通訊

要和乙個守護程序通訊,你要向它傳送訊號,讓它以某種方式相應。例如 強行要求乙個守護程序重新讀取它的配置檔案,或者改變守護程序的行為,或者指示守護程序結束執行。使用訊號與守護程序通訊。守護程序中新增訊號捕捉函式 void catch signal int sign switch sign case s...