linux 建立守護進程的相關知識

linux 建立守護進程的相關知識

http://www.114390.com/article/46410.htm php

linux 建立守護進程的相關知識,這篇文章主要介紹了linux 建立守護進程的相關知識,須要的朋友能夠參考下 linux

關鍵字:linux、守護進程 shell

建立子進程,父進程退出
  這是編寫守護進程的第一步。因爲守護進程是脫離控制終端的,所以,完成第一步後就會在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」)是不能卸載的,這對之後的使用會形成諸多的麻煩(好比系統因爲某種緣由要進入單用戶模式)。所以,一般的作法是讓」/」做爲守護進程的當前工做目錄,這樣就能夠避免上述的問題,固然,若有特殊須要,也能夠把當前工做目錄換成其餘的路徑,如/tmp。改變工做目錄的常見函數式chdir。
重設文件權限掩碼
  文件權限掩碼是指屏蔽掉文件權限中的對應位。好比,有個文件權限掩碼是050,它就屏蔽了文件組擁有者的可讀與可執行權限。因爲使用fork函數新建的子進程繼承了父進程的文件權限掩碼,這就給該子進程使用文件帶來了諸多的麻煩。所以,把文件權限掩碼設置爲0,能夠大大加強該守護進程的靈活性。設置文件權限掩碼的函數是umask。在這裏,一般的使用方法爲umask(0)。
關閉文件描述符
  同文件權限碼同樣,用fork函數新建的子進程會從父進程那裏繼承一些已經打開了的文件。這些被打開的文件可能永遠不會被守護進程讀寫,但它們同樣消耗系統資源,並且可能致使所在的文件系統沒法卸下。函數

您可能感興趣的文章:
相關文章
相關標籤/搜索