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;而且子程序也成為了乙個新程序組的組長程序;同時,子程序不關聯任何終端了;
--------------講解一些概念
當你開啟乙個存在的檔案或者建立乙個新檔案,作業系統都會返回這個檔案描述符(其實就是代表這個檔案的),後續對這個檔案的操作的一些函式,都會用到這個檔案描述符作為引數;
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);
輸出重定向:我標準輸出檔案描述符,不指向螢幕了,假如我指向(重定向)乙個檔案
重定向,在命令列中用 >即可;
輸入重定向 <
/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;
守護程序可以用命令啟動,如果想開機啟動,則需要借助 系統初始化指令碼來啟動。
守護程序不會收到來自核心的 sighup 訊號; 潛台詞就是 如果守護程序收到了 sighup訊號,那麼肯定是另外的程序發給你的;
很多守護程序把這個訊號作為通知訊號,表示配置檔案已經發生改動,守護程序應該重新讀入其配置檔案;
守護程序不會收到來自核心的 sigint(ctrl+c),sigwinch(終端視窗大小改變) 訊號;
(1)守護程序和終端不掛鉤;後台程序能往終端上輸出東西(和終端掛鉤);
(2)守護程序關閉終端時不受影響,守護程序不會隨著終端的退出而退出;
(3)…其他的,大家自己總結;
#include
#include
//malloc
#include
#include
intmain
(int argc,
char
*const
*ar**)
printf
("再見了!\n");
return0;
}
#include
#include
//malloc
#include
#include
#include
#include
//建立守護程序
//建立成功則返回1,否則返回-1
intngx_daemon()
//只有子程序流程才能走到這裡if(
setsid()
==-1)
//脫離終端,終端關閉,將跟此子程序無關
umask(0
);//設定為0,不要讓它來限制檔案許可權,以免引起混亂
fd =
open
("/dev/null"
, o_rdwr)
;//開啟黑洞裝置,以讀寫方式開啟
if(fd ==-1
)if(dup2
(fd, stdin_fileno)==-
1)//先關閉stdin_fileno[這是規矩,已經開啟的描述符,動他之前,先close],類似於指標指向null,讓/dev/null成為標準輸入;if(
dup2
(fd, stdout_fileno)==-
1)//先關閉stdin_fileno,類似於指標指向null,讓/dev/null成為標準輸出;
if(fd > stderr_fileno)
//fd應該是3,這個應該成立
}return1;
}int
main
(int argc,
char
*const
*ar**)
else
}return0;
}
通訊架構實戰 3 7 守護程序詳解 範例演示
一 普通程序執行觀察 ps eo pid,ppid,sid,tty,pgrp,comm,stat,cmd grep e bash pid nginx a 程序有對應的終端,如果終端退出,那麼對應的程序也就消失了 它的父程序是乙個bash b 終端被佔住了,你輸入各種命令這個終端都沒有反應 二 守護程...
linux 守護程序詳解及建立守護程序
linux 守護程序詳解及建立守護程序 守護程序是一種後台執行並且獨立於所有終端控制之外的程序。守護程序的啟動 要啟動乙個守護程序,可以採取一下幾種方式 守護程序的建立 先來看乙個守護程序建立的例子 include include include include define maxfd 64 vo...
(2 5)fork函式詳解 範例演示
建立程序 程序的概念 乙個可執行程式,執行起來就是乙個程序,再執行起來一次,它就又是乙個程序 多個程序可以共享同乙個 可執行檔案 文雅說法 程序 定義為程式執行的乙個例項 在乙個程序 程式 中,可以用fork 建立乙個子程序,當該子程序建立時,它從fork 指令的下一條 或者說從fork 的返回處 ...