一:普通程序執行觀察
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...