歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux Daemon進程

Linux Daemon進程

日期:2017/2/28 13:47:34   编辑:Linux教程

模型

  • 創建孤兒進程 fork()
  • 創建新的會話 setid()
  • 改變當前目錄為根目錄chdir()
  • 重設文件權限掩碼umask()
  • 關閉文件描述符close()

創建孤兒進程

創建孤兒進程只需要將父進程關閉保留子進程

pid_t pid_child=fork();
if(0<pid_child){
    exit(0);
}

創建新的會話


會話組是一個或多個進程組的集合,一個shell就是一個會話,可以分為前台進程組和後台進程組,每個進程組都有一個組長,組長進程的pid就是進程組的id,當一個會話結束的時候,依附於它的進程都會關閉
setsid()函數用於創建一個新的會話,並使得當前進程成為新會話組組長,也就是說使進程完全獨立出來,從而脫離所有其他進程的控制,但是setsid()不能在一個會話組長進程中被調用,所以我們先創建子進程,並使其成為孤兒進程,這樣它就脫離了原來的會話,此時調用setsid可以使其成為一個新的會話的組長進程。當然,作為組長進程,雖然它脫離了原來的會話,失去了終端,滿足了守護進程的需求,但是它完全可以自己再打開一個終端,所以我們有時會在准備好守護進程條件之後再fork一次創建孫進程,然後讓子進程自殺,在孫進程中執行守護進程的代碼,這樣新的守護進程就不會開啟自己的終端。

pid_t pid;
pid=setsid();

改變當前目錄為根目錄

守護進程的工作目錄是不能被卸載的,選擇根目錄是個很好的方式,切換進程的工作目錄可以使用chdir()

chdir("\");

重設文件權限掩碼

文件權限掩碼是指問家權限中被屏蔽掉的對應位,把文件權限掩碼設置為0,可以增加該守護進程的靈活性,和$umask類似,設置進程的文件權限掩碼的函數是umask()

umask(0);   //將文件權限掩碼設為0

關閉文件描述符

如果父進程中打開的文件時候沒有指定"close-on-exec"選項,那麼子進程會繼承父進程的文件描述符,這些文件描述符在制作守護進程的時候需要將其關閉。一個進程打開的所有文件描述符都在該進程的文件描述符表中,這個表的大小可以使用函數gettablesize()來獲得

fdtablesize=gettablesize();
for(fd=0;fd<fdtablesize;fd++){
    close(fd);
}

再次創建孤兒進程

pid_t pid_gchild=fork();
if(0<pid_gchild){
    exit(0);
}
//孫進程執行的代碼
Copyright © Linux教程網 All Rights Reserved