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