創建守護進程有兩種方式,一種是通過系統提供的函數實現,另一種是模仿函數的底層實現。
(一)自己創建
1.調用umask將文件模式創建屏蔽字設置爲0
2.調用fork,並且父進程退出
3.調用setsid創建一個新的會話
4.將當前工作目錄改成根目錄。
5.關閉不再需要的文件描述符。
6.其他:忽略SIGCHLD信號
以下是自己寫的守護進程:
運行結果如下:
二)調用函數的方法
#include <stdio.h>
#include<unistd.h>
int main()
{
daemon(0,0);
while(1);
}
三)關於有時候創建守護進程需要兩次fork的原因
1 、第一次fork的作用是讓shell 認爲本條命令 已經終止,不用掛在終端輸入上。還有一個作用是爲後面setsid服務。setsid的調用者不能是進程組組長(group leader). 此時父進程是進程組組長。
2、第2次fork不是必須的。也看到很多開源服務沒有fork第二次。fork第二次主要目的是。防止進程再次打開一個控制終端。因爲打開一個控制終端的前臺條件是該進程必須是會話組長。再fork一次,子進程ID != sid(sid是進程父進程的sid)。所以也無法打開新的控制終端。