守護進程
Daemon(精靈)進程,是Linux中的后臺服務進程,通常獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。一般采用以d結尾的名字。
Linux后臺的一些系統服務進程,沒有控制終端,不能直接和用戶交互。不受用戶登錄、注銷的影響,一直在運行著,他們都是守護進程。如:預讀入緩輸出機制的實現;ftp服務器;nfs服務器等。
?
創建守護進程模型
?
- 創建子進程,父進程退出 fork()
所有工作在子進程中進行形式上脫離了控制終
??2.在子進程中創建新會話? ? setsid()
setsid()函數
使子進程完全獨立出來,脫離控制
? 3.改變當前目錄為根目錄? ?chdir()
chdir()函數
防止占用可卸載的文件系統
? 也可以換成其它路徑
? 4.重設文件權限掩碼? ? umask()
umask()函數
防止繼承的文件創建屏蔽字拒絕某些權限
增加守護進程靈活性
? 5.關閉文件描述符? ? 將0/1/2重定向 /dev/null? ? dup2()
繼承的打開文件不會用到,浪費系統資源,無法卸載
? 6.開始執行守護進程核心工作
? 7.守護進程退出處理程序模型
?
#include <stdio.h>int main(void) {pid_t pid, sid;int ret, fd;pid = fork();if(pid > 0) {return 0;}sid = setsid();ret = chdir("目錄");if(ret < 0){perror("chdir error");exit(0);}umask(0002);close(STDIN_FILENO);fd = open("/dev/null", O_RDWR);dup2(0, STDOUT_FILENO);dup2(0, STDERR_FILENO);return 0; }
?