linux標準daemon編寫方式

daemon定義

運行在後臺的程序,一般不須要與用戶進行交互的。shell

任何父進程id是0的一般是kernel進程,做爲系統啓動的一部分,除了init是用戶態的命令。session

規則

  • 第一件事情是調用umask設置文件模型的mask爲0,文件mode creation mask能夠被進程繼承,但daemon進程須要建立文件時,須要特殊的權限。命令行

  • 調用fork,退出父進程exit,這能夠作幾件事情,首先,daemon將使用shell命令行啓動,其次,子進程繼承了process group id,但獲取一個新的id,所以咱們能夠確保子進程不會是一個process group leader,爲調用setsid作準備。繼承

  • 調用setsid建立一個新的session。該進程開始成爲一個新的session的session leader,而後成爲新的process group的process group leader,而且沒有controlling terminal。進程

一些基於System V的用戶推薦再fork一下,第二個child仍舊是一個daemon,而後保證該daemon不是一個session leader,在System V規則下阻止獲得一個控制終端。terminal

避免獲取一個終端,使用O_NOCTTY來確保打開一個非終端設備。it

  • 修改當前目錄爲根目錄(即/),爲房子daemon存在於mounted file system中,系統重啓時,文件系統不可以unmounted。io

  • 不須要的文件描述符應該關閉,阻止從parent中繼承下來的文件描述符。後臺

  • 因爲沒有終端的緣故,所以須要將文件描述符0,1和2將切換到/dev/null。file

相關文章
相關標籤/搜索