我們可以認為守護進程就是后臺服務進程,因為它會有一個很長的生命周期提供服務,關閉終端不會影響服務,也就是說可以忽略某些信號。
首先要保證進程在后臺運行,可以在啟動程序后面加&
,當然更原始的方法是進程自己fork
然后結(jié)束父進程。
if (pid=fork()) {
exit(0); // Parent process
}
然后是與終端、進程組、會話(Session)分離。每個進程創(chuàng)建時都綁定一個終端,而且屬于一個進程組(進程組也有GID不過等同進程組長的PID),這些進程組在一個會話中,如果是子進程一般會從父進程繼承這些信息,想要與環(huán)境分離可以使用以下的系統(tǒng)調(diào)用。
setsid();
同樣地我們會從父進程繼承文件掩碼(mask),可以手動清理掩碼。
umask(0);
如果需要我們可以改變當前工作目錄,避免運行時必須使用當前所在的文件系統(tǒng)。
前面提到過nohup
命令,是讓程序以守護進程運行的方式之一,程序運行后忽略SIGHUP信號,也就說關閉終端不會影響進程的運行。
類似的命令還有disown
,這里不再詳述。