Linux下守护进程(daemon)的实现
生活随笔
收集整理的這篇文章主要介紹了
Linux下守护进程(daemon)的实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 守護進程
- 守護進程的創(chuàng)建
- 守護進程的實現(xiàn)
守護進程
守護進程是一種特殊的孤兒進程,父進程是一號init進程,運行在后臺,與終端和登陸會話脫離關系,不受影響。
守護進程通常系統(tǒng)引導的時候啟動,并且一直運行直到系統(tǒng)關閉。另一些只在需要的時候才啟動,完成任務后就自動結(jié)束。
例如這些TPGID為-1的都是守護進程
通常我們的服務器程序需要以守護進程的方式來進行運行,使其能夠后臺化。
守護進程的創(chuàng)建
在Linux為我們提供了daemon()幫助我們創(chuàng)建守護進程
#include <unistd.h> int daemon(int nochdir, int noclose);nochdir參數(shù)用于指定是否改變當前當前的工作目錄,如果傳遞參數(shù)0,則說明將工作目錄切換到根目錄"/"下,否則繼續(xù)使用當前的工作目錄。
noclose參數(shù)用于指定是否關閉標準輸入、標準輸出、標準錯誤。如果參數(shù)為0,則將三者全部重定向到/dev/null文件中,否則繼續(xù)使用原來的設備。
那么,它是如何實現(xiàn)的呢?
守護進程的實現(xiàn)
要想使得進程能夠脫離終端、運作在后臺,就必須保證守護進程與其創(chuàng)建之前的環(huán)境分隔開,包括他從父進程繼承來的權限掩碼,工作目錄,未關閉的文件描述符,進程組,會話,控制終端等,所以我們要做的就是擺脫這些束縛,使我們能夠獨立于原先的環(huán)境。
所以需要完成以下步驟
代碼實現(xiàn)如下
#ifndef __DAEMON_H__ #define __DAEMON_H__#include<unistd.h> #include<stdlib.h> #include<fcntl.h> #include<sys/stat.h>bool daemonsize() {//創(chuàng)建子進程,關閉父進程,使子進程成為孤兒進程,由一號init進程收養(yǎng)后運作在后臺pid_t pid = fork();//子進程創(chuàng)建失敗if(pid < 0){return false;}//關閉父進程else if(pid > 0){exit(0);}//創(chuàng)建新的會話,該會話只包含子進程,并且子進程為會話首進程pid_t sid = setsid();if(sid < 0){return false;}//忽略SIGHUP信號,否則在下面關閉父進程的時候會因為脫離終端而收到該信號導致進程退出signal(SIGHUP, SIG_IGN);//再次創(chuàng)建子進程,關閉父進程。使得當前進程不再是會話首進程,無控制終端的權限if(pid < 0){return false;}//關閉父進程else if(pid > 0){exit(0);}//設置權限掩碼umask(0);//將工作目錄切換到根目錄下if(chdir("/") < 0){return false;}/* 關閉掉多余的文件描述符 *///關閉標準輸入,標準輸出,標準錯誤close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); //將標準輸入,標準輸出,標準錯誤重定向到/dev/null文件中open("/dev/null", O_RDONLY); open("/dev/null", O_RDWR);open("/dev/null", O_RDWR);return true; }#endif /* __DAEMON_H__ */總結(jié)
以上是生活随笔為你收集整理的Linux下守护进程(daemon)的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高级数据结构与算法 | 回溯算法(Bac
- 下一篇: Linux网络编程 | 事件处理模式:R