Linux 守護進程,編寫

來源:互聯網
上載者:User
設定守護進程過程:
1.建立子進程,父進程退出
2.在子進程中建立新會話
3.改變目前的目錄為根目錄
4.重設檔案許可權掩碼
5.關閉檔案描述符
*6.守護進程裡,忽略SIGCHLD訊號 (即使fork兩次,新進程由init接管,不進行signal(SIGCHLD,SIG_IGN)操作,也會產生殭屍進程。)

守護進程簡介  在linux或者unix作業系統中在系統的引導的時候會開啟很多服務,這些服務就叫做守護進程。為了增加靈活性,root可以選擇系統開啟的模式,這些模式叫做運行層級,每一種運行層級以一定的方式配置系統。  守護進程是脫離於終端並且在後台啟動並執行進程。守護進程脫離於終端是為了避免進程在執行過程中的資訊在任何終端上顯示並且進程也不會被任何終端所產生的終端資訊所打斷。  守護進程,也就是通常說的Daemon進程,是Linux中的後台服務進程。它是一個生存期較長的進程,通常獨立於控制終端並且周期性地執行某種任務或等待處理某些發生的事件。守護進程常常在系統引導裝入時啟動,在系統關閉時終止。Linux系統有很多守護進程,大多數服務都是通過守護進程實現的,同時,守護進程還能完成許多系統任務,例如,作業規划進程crond、列印進程lqd等(這裡的結尾字母d就是Daemon的意思)。  由於在Linux中,每一個系統與使用者進行交流的介面稱為終端,每一個從此終端開始啟動並執行進程都會依附於這個終端,這個終端就稱為這些進程的控制終端,當控制終端被關閉時,相應的進程都會自動關閉。但是守護進程卻能夠突破這種限制,它從被執行開始運轉,直到整個系統關閉時才退出。如果想讓某個進程不因為使用者或終端或其他地變化而受到影響,那麼就必須把這個進程變成一個守護進程。建立守護進程建立子進程,父進程退出  這是編寫守護進程的第一步。由於守護進程是脫離控制終端的,因此,完成第一步後就會在Shell終端裡造成一程式已經運行完畢的假象。之後的所有工作都在子進程中完成,而使用者在Shell終端裡則可以執行其他命令,從而在形式上做到了與控制終端的脫離。  在Linux中父進程先於子進程退出會造成子進程成為孤兒進程,而每當系統發現一個孤兒進程是,就會自動由1號進程(init)收養它,這樣,原先的子進程就會變成init進程的子進程。在子進程中建立新會話  這個步驟是建立守護進程中最重要的一步,雖然它的實現非常簡單,但它的意義卻非常重大。在這裡使用的是系統函數setsid,在具體介紹setsid之前,首先要瞭解兩個概念:進程組和會話期  進程組:是一個或多個進程的集合。進程組有進程組ID來唯一標識。除了進程號(PID)之外,進程組ID也是一個進程的必備屬性。每個進程組都有一個組長進程,其組長進程的進程號等於進程組ID。且該進程組ID不會因組長進程的退出而受到影響。  會話周期:會話期是一個或多個進程組的集合。通常,一個會話開始與使用者登入,終止於使用者退出,在此期間該使用者啟動並執行所有進程都屬於這個會話期。  接下來就可以具體介紹setsid的相關內容:  (1)setsid函數作用:  setsid函數用於建立一個新的會話,並擔任該交談群組的組長。調用setsid有下面的3個作用:  讓進程擺脫原會話的控制  讓進程擺脫原進程組的控制  讓進程擺脫原控制終端的控制  那麼,在建立守護進程時為什麼要調用setsid函數呢?由於建立守護進程的第一步調用了fork函數來建立子進程,再將父進程退出。由於在調用了fork函數時,子進程全盤拷貝了父進程的會話期、進程組、控制終端等,雖然父進程退出了,但會話期、進程組、控制終端等並沒有改變,因此,還還不是真正意義上的獨立開來,而setsid函數能夠使進程完全獨立出來,從而擺脫其他進程的控制。改變目前的目錄為根目錄  這一步也是必要的步驟。使用fork建立的子進程繼承了父進程的當前工作目錄。由於在進程運行中,目前的目錄所在的檔案系統(如“/mnt/usb”)是不能卸載的,這對以後的使用會造成諸多的麻煩(比如系統由於某種原因要進入但使用者模式)。因此,通常的做法是讓"/"作為shohujincheng 的當前工作目錄,這樣就可以避免上述的問題,當然,如有特殊需要,也可以把當前工作目錄換成其他的路徑,如/tmp。改變工作目錄的常見函數式chdir。重設檔案許可權掩碼  檔案許可權掩碼是指屏蔽掉檔案許可權中的對應位。比如,有個檔案許可權掩碼是050,它就屏蔽了檔案組擁有者的可讀與可執行許可權。由於使用fork函數建立的子進程繼承了父進程的檔案許可權掩碼,這就給該子進程使用檔案帶來了諸多的麻煩。因此,把檔案許可權掩碼設定為0,可以大大增強該守護進程的靈活性。設定檔案許可權掩碼的函數是umask。在這裡,通常的使用方法為umask(0)。關閉檔案描述符  同檔案許可權碼一樣,用fork函數建立的子進程會從父進程那裡繼承一些已經開啟了的檔案。這些被開啟的檔案可能永遠不會被守護進程讀寫,但它們一樣消耗系統資源,而且可能導致所在的檔案系統無法卸下。  在上面的第二步之後,守護進程已經與所屬的控制終端失去了聯絡。因此從終端輸入的字元不可能達到守護進程,守護進程中用常規方法(如printf)輸出的字元也不可能在終端上顯示出來。所以,檔案描述符為0、1和2 的3個檔案(常說的輸入、輸出和報錯)已經失去了存在的價值,也應被關閉。通常按如下方式關閉檔案描述符:  ===============================  for(i=0;i<MAXFILE;i++)  close(i);  ===============================  這樣,一個簡單的守護進程就建立起來了。  來自:http://www.360doc.com/content/10/0610/11/61151_32290457.shtml
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.