Linux守護進程

来源:https://www.cnblogs.com/GyForever1004/archive/2018/02/02/8407125.html
-Advertisement-
Play Games

守護進程的特點 守護進程(Daemon)是在後臺運行的一種特殊進程,它脫離於終端,從而這可避免進程被任何終端所產生的信號打斷,它在執行進程中的產生信息也不在任何終端上顯示。守護進程周期性地執行某種任務或等待處理某些發生的事件,Linux的大多數伺服器就是用守護進程實現的。 守護進程編程要點 1.屏蔽 ...


首先說一下後臺進程與守護進程的區別

最大的區別有以下幾點:

(a)守護進程已經完全脫離終端控制台了,而後臺程式並未完全脫離終端(在終端未關閉前還是會往終端輸出結果);
(b)守護進程在關閉終端控制台時不會受影響,而後臺程式會隨用戶退出而停止,需要在以nohup command & 格式運行才能避免影響;
(c)守護進程的會話組和當前目錄,文件描述符都是獨立的。後臺運行只是終端進行了一次fork,讓程式在後臺執行,這些都沒改變; 
守護進程的特點

守護進程(Daemon)是在後臺運行的一種特殊進程,它脫離於終端,從而這可避免進程被任何終端所產生的信號打斷,它在執行進程中的產生信息也不在任何終端上顯示。守護進程周期性地執行某種任務或等待處理某些發生的事件,Linux的大多數伺服器就是用守護進程實現的。

守護進程編程要點

1.屏蔽一些有關控制終端操作的信號,是為了防止在守護進程沒有正常啟動起來前,控制終端受到干擾退出或掛起。代碼如下:

/* 處理可能的終端信號 */
signal(SIGTTOU, SIG_IGN);
signal(SIGTTIN, SIG_IGN);
signal(SIGTSTP, SIG_IGN);
signal(SIGHUP , SIG_IGN);

2.在後臺運行。

/* 是父進程,結束父進程,子進程繼續 */
if(fork())
    exit(0);

3.脫離控制終端和進程組:

(1)一個進程屬於一個進程組,進程組號(PGID)就是進程組長的進程號(PID)

(2)同進程組中的進程共用一個控制終端,這個控制終端預設是創建進程的終端

(3)一個進程關聯的控制終端和進程組通常是從父進程繼承下來的,因此,這個子進程仍然受到父親進程終端的影響,因為終端產生的信號會發送給前臺進程組的所有進程。

基於以上原因,需要讓為個子進程徹底擺脫該終端的影響,需要調用setsid()使子進程成為新的會話組長,代碼如下:

setsid();

setsid()調用成功後,調用此函數的進程成為新的會話組長和新的進程組長,並與原來的進程組脫離關係。由於會話過程對控制終端的獨占性,進程同時與控制終端脫離。

4.禁止進程重新打開控制終端,採用的辦法是再次創建一個子進程,並讓父親進程退出,該子進程不再是會話組長,從而達到目的。代碼如下:

/* 結束第一子進程,第二子進程繼續 */
if(fork())
    exit(0);

5.關閉打開的文件描述符。因為進程從創建它的父進程那裡繼承了打開的文件描述符,一般情況下不再需要。如不關閉,將會浪費系統資源。代碼如下:

#define NOFILE  256

for(i=0; i<NOFILE; i++)
    close(i);

6.改變當前工作目錄。進程活動時,其工作目錄所在的文件系統不能卸載。因此需要將守護進程的工作目錄改變到合適的目錄。代碼如下:

chdir("/tmp");

7.重設文件創建掩碼。進程從創建它的父進程那裡繼承了文件創建掩碼。它可能修改守護進程所創建的文件的存取許可權。代碼如下:

umask(0);

8.處理SIGCHLD信號(子進程退出信號)。如果不等待子進程結束,子進程將成為僵屍進程從而占用系統內核資源。

/* 將子進程退出信號設為SIG_IGN,讓系統幫助回收進程資源 */
signal(SIGCHLD, SIG_IGN);
整體代碼如下:
#define NOFILE      256

void DaemonMode()
{
    int num = 0;
    int fd0, fd1, fd2;

    /* 屏蔽可能的信號 */
    signal(SIGTTOU, SIG_IGN);
    signal(SIGTTIN, SIG_IGN);
    signal(SIGTSTP, SIG_IGN);
    signal(SIGHUP , SIG_IGN);

    if(fork())
        exit(0);

    setsid();

    if(fork())
        exit(0);

    chdir("/tmp/httpd");

    umask(0);

    for(; num<NOFILE; num++)
        close(num);
    
    /* 將輸入、輸出重定向。因為之前描述符都關閉了,所以新打開值為0、1、2 */
    fd0 = open("/dev/null", O_RDWR);
    fd1 = dup(0);
    fd2 = dup(0);

    signal(SIGCHLD, SIG_IGN);
}
補充 setsid() 函數功能:
如果調用進程已經是一個進程組的組長,則此函數返回錯誤。為了杜絕這種情況,通常先調用fork()創建子進程,
然後使其父進程終止,而子進程繼續,在子進程中調用此函數。

如果調用此函數的進程不是一個進程組組長,則此函數會創建一個新會話,調用setsid()函數的進程成為新的會話的領頭進程,
並與其父進程的會話組和進程組脫離。由於會話對控制終端的獨占性,進程同時與控制終端脫離。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DMSkin-for-WPF是一個基於WPF的.Net WPF開源界面庫,實現了無邊框的WPF開發方案,內置部分控制項模板. 你可以參照模板自行修改完善。(以下簡稱DFW)。 核心 DFW實現了比較完美的無邊框窗體方案,並且拖拽全部採用WIN32消息實現。拖拽依靠桌面邊緣完美,高DPI支持,窗體不會變 ...
  • 前兩天在學習MongoDB相關的知識,做了個小Demo,做的是省份下麵有多少所學校,嗯,做的比較粗暴。。。 連接MongoDB首先要通過Nuget添加一個MongoDB的包,下載此包 安裝完畢後開始寫代碼了,創建一個省份實體,一個學校實體 創建上下文類,連接MongoDB 創建控制器 視圖 運行的時 ...
  • 項目結構: 首先引用 Microsoft.EntityFrameworkCore.Tools Microsoft.EntityFrameworkCore.Design 增加類DesignTimeDbContextFactory QHContext 類 編輯Qh.Data項目的csproj 增加 <I ...
  • 用C#編寫的天氣預報小工具 功能 1、查詢中國省份、城市及地區三級的天氣預報; 2、顯示1-7天一周的天氣預報及未來8-15天的天氣預報; 3、能定製地區的天氣預報。 界面 源代碼: 註: 1、軟體代碼為原創,如需轉載,請註明出處; 2、部分網路素材及軟體樣式參考“小熊吉米”的博客園博文(全國天氣預 ...
  • 核心尋峰演算法的原理參考Ronny,鏈接:投影曲線的波峰查找, C#翻譯原理代碼參考sowhat4999,鏈接:C#翻譯Matlab中findpeaks方法 前人種樹,後人乘涼。感謝原作者詳細的解釋說明。 這裡先把翻譯代碼貼一下(略微的修改了sowhat4999代碼中的幾個參數) 以上方法並沒有將峰距 ...
  • 演示產品源碼下載地址:http://www.jinhusns.com/Products/Download ...
  • 於是查看系統日誌: 具體信息如下:日誌名稱: System來源: Service Control Manager日期: 2015/11/29 16:53:06事件 ID: 7024任務類別: 無級別: 錯誤關鍵字: 經典用戶: 暫缺電腦: DESKTOP-MKK5408描述:IIS Admin S ...
  • 前言:布衣博主乃苦逼的Java程式猿一枚,雖然工作中不會涉及系統運維,但是開發的項目總還是要部署到伺服器做一些負載均衡、系統相容性測試、系統集成等等騷操作,而這些測試性的操作不可能直接SSH遠程運維的伺服器任我行般瞎搞一通的,所以在個人的開發機上虛擬機一套Linux系統做為測試伺服器也就成了程式猿的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...