日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux下守护进程(daemon)的实现

發布時間:2024/4/11 linux 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux下守护进程(daemon)的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 守護進程
  • 守護進程的創建
  • 守護進程的實現


守護進程

守護進程是一種特殊的孤兒進程,父進程是一號init進程,運行在后臺,與終端和登陸會話脫離關系,不受影響。
守護進程通常系統引導的時候啟動,并且一直運行直到系統關閉。另一些只在需要的時候才啟動,完成任務后就自動結束。

例如這些TPGID為-1的都是守護進程

通常我們的服務器程序需要以守護進程的方式來進行運行,使其能夠后臺化


守護進程的創建

在Linux為我們提供了daemon()幫助我們創建守護進程

#include <unistd.h> int daemon(int nochdir, int noclose);

nochdir參數用于指定是否改變當前當前的工作目錄,如果傳遞參數0,則說明將工作目錄切換到根目錄"/"下,否則繼續使用當前的工作目錄。
noclose參數用于指定是否關閉標準輸入、標準輸出、標準錯誤。如果參數為0,則將三者全部重定向到/dev/null文件中,否則繼續使用原來的設備。

那么,它是如何實現的呢?

守護進程的實現

要想使得進程能夠脫離終端、運作在后臺,就必須保證守護進程與其創建之前的環境分隔開,包括他從父進程繼承來的權限掩碼,工作目錄,未關閉的文件描述符,進程組,會話,控制終端等,所以我們要做的就是擺脫這些束縛,使我們能夠獨立于原先的環境。

所以需要完成以下步驟

  • 創建子進程,關閉父進程,使當前進程成為孤兒進程
  • 創建新的會話,成為會話首進程
  • 屏蔽SIGHUP信號(防止因為脫離終端時被結束進程)
  • 再次創建子進程,關閉父進程,使子進程不是會話首進程,無控制終端的權限
  • 設置權限掩碼
  • 切換工作目錄到根目錄下
  • 關閉標準輸入、標準輸出、標準錯誤設備
  • 關閉其他已經打開的文件描述符
  • 將標準輸入、標準輸出、標準錯誤重定向至/dev/null文件中
  • 代碼實現如下

    #ifndef __DAEMON_H__ #define __DAEMON_H__#include<unistd.h> #include<stdlib.h> #include<fcntl.h> #include<sys/stat.h>bool daemonsize() {//創建子進程,關閉父進程,使子進程成為孤兒進程,由一號init進程收養后運作在后臺pid_t pid = fork();//子進程創建失敗if(pid < 0){return false;}//關閉父進程else if(pid > 0){exit(0);}//創建新的會話,該會話只包含子進程,并且子進程為會話首進程pid_t sid = setsid();if(sid < 0){return false;}//忽略SIGHUP信號,否則在下面關閉父進程的時候會因為脫離終端而收到該信號導致進程退出signal(SIGHUP, SIG_IGN);//再次創建子進程,關閉父進程。使得當前進程不再是會話首進程,無控制終端的權限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__ */

    總結

    以上是生活随笔為你收集整理的Linux下守护进程(daemon)的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。