您好,登錄后才能下訂單哦!
小編給大家分享一下linux中如何建立守護進程,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
linux 守護進程詳解及建立守護進程
守護進程是一種后臺運行并且獨立于所有終端控制之外的進程。
守護進程的啟動
要啟動一個守護進程,可以采取一下幾種方式:
在系統期間通過系統的初始化腳本啟動守護進程。這些腳本通常在目錄etc/rc.d下,通過它們所啟動的守護進程具有超級用戶的權限。系統的一些基本服務通常都是通過這種方式啟動的。
很多網絡服務程序都是由inetd守護程序啟動的。它監聽各種網絡請求,如telnet、ftp等,在請求到達時啟動相應的服務器程序(telnet server,ftp server等)。
由cron定時啟動的處理程序。這些程序在運行時實際上也是一種守護進程。
由at啟動的處理程序。
守護程序也可以從終端啟動,通常這種方式只用于守護進程的測試,或者是重啟因某種原因而停止的進程。
在終端上用nohup啟動的進程。用這種方法可以把所有的程序都變成守護進程。
守護進程的建立
先來看一個守護進程建立的例子:
#include <sys/types.h> #include <signal.h> #include <unistd.h> #include <syslog.h> #define MAXFD 64 void daemon_init(const char* pname, int facility){ int i; pit_t pid; /*fork(),終止父進程*/ if(pid=fork()){ exit(0); } /*第一子進程*/ setsid(); signal(SIGHUP,SIG_IGN); /*fork()終止第一子進程*/ if(pid=fork()) exit(0); /*第二子進程*/ daemon_proc = 1; /*將工作目錄設定位“/”*/ chdir("/"); /*清除文件掩碼*/ umask(0); for(i = 0; i<MAXFD; i++){ close(i); } /*打開log*/ openlog(pname, LOG_PID, facility); }
從上面的程序可以看出,建立一個守護進程需要以下操作:
fork。首先需要fork一個子進程并將父進程關閉。如果進程是作為一個shell命令在命令行前臺啟動的,當父進程終止時,shell就認為該命令已經結束。這樣子進程就自動成為了后臺進程。而且,子進程從父進程那里繼承了組標識符同時又擁有了自己的進程標識符,這樣保證了子進程不會是一個進程組的首進程。這一點是下一步setsid所必需的。
setsid。setsid()調用創建了一個新的進程組,調用進程成為該進程組的首進程。這樣,就使該進程脫離原來的終端,成為了獨立終端外的進程。
忽略SIGHUP信號,重新fork。這樣使進程不再是進程組的首進程,可以防止在某些情況下進程意外的打開終端而重新與終端發生聯系。
改變工作目錄,清楚文件掩碼。改變工作目錄主要是為了切斷進程與原有文件系統的聯系。并且保證無論從什么地方啟動進程都能正常工作。清除文件掩碼是為了消除進程自身掩碼對其創建文件的影響。
關閉全部已打開的文件句柄。這是為了防止子進程繼承在父進程中打開的文件而使這些文件始終保持打開從而產生某些沖突。
打開log系統。
以上是“linux中如何建立守護進程”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。