首頁 > 軟體

Linux Daemon進程

2020-06-16 17:29:45

模型

  • 建立孤兒進程 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);
}
//孫進程執行的程式碼

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-11/136702.htm


IT145.com E-mail:sddin#qq.com