守護進程

、守護進程定義服務器

    守護進程也稱精靈進程( Daemon),是運行在後臺的一種特殊進程。它獨立於控制終端而且週期性地執行某種任務或等待處理某些發生的事件。守護進程是一種頗有用的進程。 Linux的大多數服務器就是用守護進程實現的。好比,Internet服務器inetd,Web服務器httpd 等。同時,守護進程完成許多系統任務。好比,做業規劃進程crond等。 
ide

2、守護進程的建立方法函數

    1.調用umask將文件模式建立屏蔽字設置爲0spa

    2.建立子進程,父進程退出blog

    因爲守護進程是脫離控制終端的,所以,完成這一步後就會在Shell終端裏形成一程序已經運行完畢的假象。以後的全部工做都在子進程中完成,而用戶在Shell終端裏則能夠執行其餘命令,從而在形式上作到了與控制終端的脫離。進程

    在Linux中父進程先於子進程退出會形成子進程成爲孤兒進程,而每當系統發現一個孤兒進程時,就會自動由1號進程(init)收養它,這樣,原先的子進程就會變成init進程的子進程。事件

    3.在子進程中建立新會話get

    這個步驟是建立守護進程中最重要的一步,雖然它的實現很是簡單,但它的意義卻很是重大。使用的是系統函數setsid。it

    該函數調用成功時返回新建立的Session的id(其實也就是當前進程的id),出錯返回-1。注意,調用這個函數以前,當前進程不容許是進程組的Leader,不然該函數返回-1。因此第一步先建立子進程,fork建立的子進程和父進程在同一個進程組中,進程組的Leader必然是該組的第一個進程,因此子進程不多是該組的第一個進程,在子 程中調用setsid就不會有問題了。io

    成功調用該函數的結果是: 

   (1)建立一個新的Session,當前進程成爲Session Leader,當前進程的id就是Session的id。 

   (2)建立一個新的進程組,當前進程成爲進程組的Leader,當前進程的id就是進程組id。 

   (3)若是當前進程本來有一個控制終端,則它失去這個控制終端,成爲一個沒有控制終端的進 程。所謂失去控制終端是指,原來的控制終端仍然是打開的,仍然能夠讀寫,但只是一個普 通的打開文件而不是控制終端了。  

4. 將當前工做目錄更改成根目錄。

5. 關閉不在須要的文件描述符。 

6. 其餘:忽略SIGCHLD信號。

3、守護進程代碼實現

wKiom1eRt9PwMGsIAABcB626r5w286.jpg-wh_50

wKioL1eRt9TgDt8RAAA472qkZZQ395.jpg-wh_50

wKiom1eRuFHTsrWqAAASw0hbxBE071.jpg-wh_50

4、fork一次和兩次的區別

    在建立守護進程時,建立子進程能夠fork一次,也能夠fork兩次。

    第一次fork完成後,就會在Shell終端裏形成一程序已經運行完畢的假象。以後的全部工做都在子進程中完成,而用戶在Shell終端裏則能夠執行其餘命令,從而在形式上作到了與控制終端的脫離。

     第二次fork是爲了防止後期可能會誤操做打開了終端。因爲只有會話首進程能打開終端設備,因此再次fork,fork建立的子進程和父進程在同一個進程組中,進程組的Leader必然是該組的第一個進程,因此子進程不多是該組的第一個進程。在子進程中調用setsid就沒有問題了。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息