UNIX高階程式設計 第13章 守護程序

2021-08-28 05:24:38 字數 1590 閱讀 6598

請移步到這:

13.2 守護程序的特徵

注意,大多數守護程序都以超級使用者(root)特權執行。所有的守護程序都沒有控制終端,其終端名設定為問號。

核心守護程序以無控制終端方式啟動。使用者層守護程序缺少控制終端可能是守護程序呼叫了setsid的結果。

大多數使用者層守護程序都是程序組的組長程序以及會話的首程序,而且是這些程序組和會話中的唯一程序(rsyslogd是乙個例外)

使用者層守護程序的父程序是init程序。

13.3 編寫規則

13.4 出錯記錄

大多數sysloq實現將使訊息短時間處於佇列中。如果在此段時間中有重複訊息到達,那麼 sysloq守護程序不會把它寫到日誌記錄中,

而是會列印輸出一條類似於「上一條訊息重複了n次」的訊息。

13.5 單例程守護程序

(1)因為守護程序是長時間執行而不退出,因此./a.out執行一次就有乙個程序,執行多次就有多個守護程序。

(2)這樣並不是我們想要的。我們守護程序一般都是伺服器,伺服器程式只要執行乙個就夠了,多次同時執行並沒有意義甚至會帶來錯誤。

(3)當個多個守護程序訪問同乙個裝置時,會出現問題

要解決就要在訪問上面加一些限制:

如使用檔案鎖

13.6 守護程序的慣例

13.6 守護程序的慣例

守護程序常常用作伺服器程序。確實,我們可以稱圖13-2中的syslogd程序為伺服器程序,使用者程序(客戶程序)用unix域資料報套接字向其傳送訊息。

一般而言,伺服器程序等待客戶程序與其聯絡,提出某種型別的服務要求。圖13-2中,由 syslogd伺服器程序提供的服務是將一條出錯訊息記錄到日誌檔案中。

圖13-2中,客戶程序和伺服器程序之間的通訊是單向的。客戶程序向伺服器程序傳送服務請求,伺服器程序則不向客戶程序回送任何訊息。在下面有關程序通訊的幾章中,我們將見到大量客戶程序和伺服器程序之間雙向通訊的例項。客戶程序向伺服器程序傳送請求,伺服器程序則向客戶程序回送應答。

在伺服器程序中呼叫fork然後exec另乙個程式來向客戶程序提供服務是很常見的。

這些伺服器程序通常管理著多個檔案描述符:通訊端點、配置檔案、日誌檔案和類似的檔案。

最好的情況:

讓子程序中的這些檔案描述符保持開啟狀態並無大礙,因為它們很可能不會被在子程序中執行的程式所使用,尤其是那些與伺服器端無關的程式。

最壞情況:

保持它們的開啟狀態會導致安全問題-被執行的程式可能有一些惡意行為,如更改伺服器端配置檔案或欺騙客戶端程式使其認為正在與伺服器端通訊,從而獲取未授權的資訊。

解決此問題的乙個簡單方法是對所有被執行程式不需要的檔案描述符設定執行時關閉, (close-on-exec)標誌。圖13-9展示了乙個可以用來在伺服器端程序中執行上述工作的函式。

fcntl的close-on-exec標誌

每個檔案描述符都有乙個close-on-exec標誌。預設情況下,這個標誌最後一位被設定為 0。這個標誌符的具體作用在於當開闢其他程序呼叫exec()族函式時,在呼叫exec函式之前為exec族函式釋放對應的檔案描述符。

參考:int flags = fcntl(fd, f_getfd);

flags |= fd_cloexec;

fcntl(fd, f_setfd, flags);

UNIX高階環境程式設計 第13章 守護程序

守護程序 沒有控制終端,長期執行在後台的程序 void daemonize const char cmd else if pid 0 呼叫setsid以建立乙個新會話 使呼叫程序 a.成為新會話的首程序,b.成為乙個新程序組的組長程序,c.沒有控制終端。setsid struct sigaction...

UNIX程式設計 13 守護程序

1.守護程序的程式設計規則 1 用umask將檔案模式建立遮蔽字設定為0 2 呼叫fork,然後使父程序退出 3 呼叫setsid建立乙個新會話 4 將當前工作目錄更改為根目錄 5 關閉不再需要的的檔案描述符 6 某些守護程序開啟 dev null使其具有檔案描述符0,1,2,例 初始化乙個守護程序...

第13章 MySQL高階程式設計

1.事務 乙個或一系列的查詢 2.使用事務安全的 型別 通過innodb 關閉自動提交 set autocommit 0 若自動提交被開啟,須使用如下語句開始乙個事務 start transaction 若自動提交是關閉的則不需要此句 完成組成事務的語句輸入後,提交給資料庫 commit 回到資料庫...