Linux編程之《守護進程》

来源:http://www.cnblogs.com/highway-9/archive/2016/05/17/5500341.html
-Advertisement-
Play Games

Intro 守護進程,也就是通常說的Daemon進程,是Linux中的後臺服務進程。它是一個生存期較長的進程,通常獨立於控制終端並且周期性地執行某種任務或等待處理某些發生的事件。守護進程常常在系統引導裝入時啟動,在系統關閉時終止。Linux系統有很多守護進程,大多數服務都是通過守護進程實現的,同時, ...


Intro

-----

守護進程,也就是通常說的Daemon進程,是Linux中的後臺服務進程。它是一個生存期較長的進程,通常獨立於控制終端並且周期性地執行某種任務或等待處理某些發生的事件。守護進程常常在系統引導裝入時啟動,在系統關閉時終止。Linux系統有很多守護進程,大多數服務都是通過守護進程實現的,同時,守護進程還能完成許多系統任務,例如,作業規划進程crond、列印進程lqd等(這裡的結尾字母d就是Daemon的意思)。

由於在Linux中,每一個系統與用戶進行交流的界面稱為終端,每一個從此終端開始運行的進程都會依附於這個終端,這個終端就稱為這些進程的控制終端,當控制終端被關閉時,相應的進程都會自動關閉。但是守護進程卻能夠突破這種限制,它從被執行開始運轉,直到整個系統關閉時才退出。如果想讓某個進程不因為用戶或終端或其他地變化而受到影響,那麼就必須把這個進程變成一個守護進程,下麵將完整代碼貼上。

  1 /************************************************
  2  * 該常式講解Linux守護進程的編程方法
  3 ************************************************/
  4 #include <unistd.h>
  5 #include <signal.h>
  6 #include <sys/param.h>  // NOFILE
  7 #include <sys/stat.h>   // umask
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 #include <time.h>
 11 #include <assert.h>
 12 
 13 bool initDaemon()
 14 {
 15     // 屏蔽一些有關控制終端操作的信號
 16     // 防止守護進程沒有正常運轉起來時,因控制終端受到干擾退出或掛起
 17     assert(signal(SIGINT, SIG_IGN) != SIG_ERR); // 終端中斷
 18     assert(signal(SIGHUP, SIG_IGN) != SIG_ERR); // 連接掛斷
 19     assert(signal(SIGQUIT, SIG_IGN) != SIG_ERR);// 終端退出
 20     assert(signal(SIGPIPE, SIG_IGN) != SIG_ERR);// 向無讀進程的管道寫數據
 21     assert(signal(SIGTTOU, SIG_IGN) != SIG_ERR);// 後臺程式嘗試寫操作
 22     assert(signal(SIGTTIN, SIG_IGN) != SIG_ERR);// 後臺程式嘗試讀操作
 23     assert(signal(SIGTERM, SIG_IGN) != SIG_ERR);// 終止
 24 
 25     // [1] 創建一個子進程,父進程退出
 26     int pid = fork();
 27     if (pid)
 28     {
 29         // 父進程退出
 30         exit(0);
 31     }
 32     else if (pid < 0)
 33     {
 34         return false;
 35     }
 36 
 37     // 子進程繼續運行
 38     
 39     // [2] 在子進程中創建新的會話,setsid有三個作用
 40     // a.讓進程擺脫原會話的控制
 41     // b.讓進程擺脫原進程組的控制
 42     // c.讓進程擺脫原控制終端的控制
 43     int ret = setsid();
 44     if (ret < 0)
 45     {
 46         return false;
 47     }
 48 
 49     // [3] 禁止進程重新打開控制終端
 50     // 進程已經成為無終端的會話組長,但它可以重新申請打開一個控制終端
 51     // 可以通過使進程不再成為會話組長來禁止進程重新打開控制終端
 52     pid = fork();
 53     if (pid)
 54     {
 55         // 結束第一個子進程
 56         exit(0);
 57     }
 58     else if (pid < 0)
 59     {
 60         return false;
 61     }
 62 
 63     // 第二個子進程繼續運行
 64 
 65     // [4] 關閉打開的文件描述符
 66     // 進程從創建它的父進程那裡繼承了打開的文件描述符,如果不關閉,將會浪費系統資源,
 67     // 造成進程所在的文件系統無法卸下以及引起無法預料的錯誤
 68     for (int i = 0; i < NOFILE; ++i)
 69     {
 70         close(i);
 71     }
 72 
 73     // [5] 改變當前工作目錄
 74     // 進程活動時,其工作目錄所在的文件系統不能卸下,一般將工作目錄改變到根目錄
 75     ret = chdir("/");
 76     if (ret < 0)
 77     {
 78         return false;
 79     }
 80 
 81     // [6] 重新設置文件創建掩碼
 82     // 進程從創建它的父進程那裡繼承了文件創建掩碼,它可能修改守護進程所創建的文件的存取位
 83     // 所以將文件創建掩碼清除
 84     umask(0);
 85 
 86     return true;
 87 }
 88 
 89 int main()
 90 {
 91     // 初始化守護進程
 92     bool ret = initDaemon();
 93     if (!ret)
 94     {
 95         printf("Init daemon failed\n");
 96         return 1;
 97     }
 98 
 99     FILE* file = NULL;
100     time_t t = 0;
101 
102     // 每隔10秒向test.log報告運行狀態
103     while (true)
104     {
105         sleep(10);
106         file = fopen("./var/test.log", "a+");
107         if (file != NULL)
108         {
109             t = time(NULL);
110             fprintf(file, "I am here at %s\n", asctime(localtime(&t)));
111             fclose(file);
112         }
113     }
114 
115     return 0;
116 }

 

該例子的github地址:https://github.com/chxuan/samples/blob/master/Daemon/Daemon.cpp


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

-Advertisement-
Play Games
更多相關文章
  • ...
  • smbpasswd命令的常用方法smbpasswd -a 增加用戶(該賬戶必須存在於/etc/passwd文件中)smbpasswd -d 凍結用戶,就是這個用戶不能在登錄了smbpasswd -e 解凍用戶,讓凍結的用戶可以在使用smbpasswd -n 把用戶的密碼設置成空. 要在global中 ...
  • 1.去http://redis.io/download下載redis-2.8.24.tar.gz 2.解壓redis-2.8.24.tar.gz並安裝 3.創建redis用戶和數據存儲目錄 4.複製redis.conf文件到/etc目錄下,並修改文件 主伺服器上修改配置文件redis.conf 從服 ...
  • 1.在主從伺服器上/etc/yum.repos.d/目錄下創建文件mongodb.repo,它包含MongoDB倉庫的配置信息,內容如下: 2.在主從伺服器上執行安裝命令 3.在主從伺服器上自定義db和log存放路徑 新建存放DB目錄,修改許可權 主伺服器修改/etc/mongod.conf logp ...
  • 防火牆的初始化 廢話不多說,先上一張表格: 清空預設表(filter表)中的數據,只要簡單的使用下麵這條命令即可: 清除預設表中INPUT鏈的規則,可使用下麵的命令: 命令執行完成後,使用iptables -L查看當前防火牆設置。 給鏈設置預設策略基本語法如下: 其中archy是鏈的名稱,targe ...
  • 1:/etc/passwd 打開該文件,可以看到每一行內容被分割成了7個欄位比如:root:x:0:0:root:/root:/bin/bash 第一個欄位表示用戶名為root用戶 第二個欄位存放了該賬號的密碼,早期unix是存放在這,出於安全考慮,改為存放在/etc/shadow 這裡用x替代 第 ...
  • 簡介: PHP FastCGI 優點 1、PHP 腳本運行速度更快。PHP 解釋程式被載入記憶體而不用每次需要時從存儲器讀取,極大的提升了依靠腳本運行站點的性能。 2、需要使用的系統資源更少。由於伺服器不再每次需要時都載入 PHP 解釋程式,可以將站點的傳輸速度提升很多而不必增加 CPU 負擔。 3、 ...
  • 位置大概: ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...