1. 程式人生 > >Linux deamon程序——建立守護程序步驟與setsid()函式

Linux deamon程序——建立守護程序步驟與setsid()函式

轉載地址

一,守護程序概述

Linux Daemon(守護程序)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。它不需要使用者輸入就能執行而且提供某種服務,不是對整個系統就是對某個使用者程式提供服務。Linux系統的大多數伺服器就是通過守護程序實現的。常見的守護程序包括系統日誌程序syslogd、 web伺服器httpd、郵件伺服器sendmail和資料庫伺服器mysqld等。

守護程序一般在系統啟動時開始執行,除非強行終止,否則直到系統關機都保持執行。守護程序經常以超級使用者(root)許可權執行,因為它們要使用特殊的埠(1-1024)或訪問某些特殊的資源。

一個守護程序的父程序是init程序,因為它真正的父程序在fork出子程序後就先於子程序exit退出了,所以它是一個由init繼承的孤兒程序。守護程序是非互動式程式,沒有控制終端,所以任何輸出,無論是向標準輸出裝置stdout還是標準出錯裝置stderr的輸出都需要特殊處理。

守護程序的名稱通常以d結尾,比如sshd、xinetd、crond等

二,建立守護程序步驟

首先我們要了解一些基本概念:

程序組 :

  • 每個程序也屬於一個程序組
  • 每個程序主都有一個程序組號,該號等於該程序組組長的PID號 .
  • 一個程序只能為它自己或子程序設定程序組ID號

會話期:

會話期(session)是一個或多個程序組的集合。

setsid()函式可以建立一個對話期:

如果,呼叫setsid的程序不是一個程序組的組長,此函式建立一個新的會話期。

(1)此程序變成該對話期的首程序

(2)此程序變成一個新程序組的組長程序。

(3)此程序沒有控制終端,如果在呼叫setsid前,該程序有控制終端,那麼與該終端的聯絡被解除。 如果該程序是一個程序組的組長,此函式返回錯誤。

(4)為了保證這一點,我們先呼叫fork()然後exit(),此時只有子程序在執行。

現在我們來給出建立守護程序所需步驟:

編寫守護程序的一般步驟步驟:

(1)在父程序中執行fork並exit推出;

(2)在子程序中呼叫setsid函式建立新的會話;

(3)在子程序中呼叫chdir函式,讓根目錄 ”/” 成為子程序的工作目錄;

(4)在子程序中呼叫umask函式,設定程序的umask為0;

(5)在子程序中關閉任何不需要的檔案描述符

說明:

1. 在後臺執行
為避免掛起控制終端將Daemon放入後臺執行。方法是在程序中呼叫fork使父程序終止,讓Daemon在子程序中後臺執行。 
if(pid=fork()) 
exit(0);//是父程序,結束父程序,子程序繼續 


2. 脫離控制終端,登入會話和程序組 
有必要先介紹一下Linux中的程序與控制終端,登入會話和程序組之間的關係:程序屬於一個程序組,程序組號(GID)就是程序組長的程序號(PID)。登入會話可以包含多個程序組。這些程序組共享一個控制終端。這個控制終端通常是建立程序的登入終端。 
控制終端,登入會話和程序組通常是從父程序繼承下來的。我們的目的就是要擺脫它們,使之不受它們的影響。方法是在第1點的基礎上,呼叫setsid()使程序成為會話組長: 
setsid(); 
說明:當程序是會話組長時setsid()呼叫失敗。但第一點已經保證程序不是會話組長。setsid()呼叫成功後,程序成為新的會話組長和新的程序組長,並與原來的登入會話和程序組脫離。由於會話過程對控制終端的獨佔性,程序同時與控制終端脫離。

 
3. 禁止程序重新開啟控制終端 
現在,程序已經成為無終端的會話組長。但它可以重新申請開啟一個控制終端。可以通過使程序不再成為會話組長來禁止程序重新開啟控制終端: 
if(pid=fork()) 
exit(0);//結束第一子程序,第二子程序繼續(第二子程序不再是會話組長) 。


4. 關閉開啟的檔案描述符 
程序從建立它的父程序那裡繼承了開啟的檔案描述符。如不關閉,將會浪費系統資源,造成程序所在的檔案系統無法卸下以及引起無法預料的錯誤。按如下方法關閉它們: 
for(i=0;i 關閉開啟的檔案描述符close(i);> 


5. 改變當前工作目錄 
程序活動時,其工作目錄所在的檔案系統不能卸下。一般需要將工作目錄改變到根目錄。對於需要轉儲核心,寫執行日誌的程序將工作目錄改變到特定目錄如/tmpchdir("/") 。


6. 重設檔案建立掩模 
程序從建立它的父程序那裡繼承了檔案建立掩模。它可能修改守護程序所建立的檔案的存取位。為防止這一點,將檔案建立掩模清除:umask(0); 


7. 處理SIGCHLD訊號 
處理SIGCHLD訊號並不是必須的。但對於某些程序,特別是伺服器程序往往在請求到來時生成子程序處理請求。如果父程序不等待子程序結束,子程序將成為殭屍程序(zombie)從而佔用系統資源。如果父程序等待子程序結束,將增加父程序的負擔,影響伺服器程序的併發效能。在Linux下可以簡單地將SIGCHLD訊號的操作設為SIG_IGN。 
signal(SIGCHLD,SIG_IGN); 
這樣,核心在子程序結束時不會產生殭屍程序。這一點與BSD4不同,BSD4下必須顯式等待子程序結束才能釋放殭屍程序。

deamon程序的標準實行,關閉了標準輸入輸出後,重新打開了/dev/null,就是黑洞,然後dup(0),dup(0),相當於將fd=0,1,2,都指向了黑洞。

例項:

 if (fork() != 0) {
    exit(0);
  }
  setsid();
  if (fork() != 0) {
    exit(0);
  }

  close(0);
  close(1);
  close(2);
  open("/dev/null", O_RDWR);
  dup(0);
  dup(0);
  return true;
}

相關推薦

Linux deamon程序——建立守護程序步驟setsid()函式

轉載地址 一,守護程序概述 Linux Daemon(守護程序)是執行在後臺的一種特殊程序。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。它不需要使用者輸入就能執行而且提供某種服務,不是對整個系統就是對某個使用者程式提供服務。Linux系統的大多數伺服

用C語言在Linux系統下建立守護程序(Daemon)

      守護程序(daemon)是指在後臺執行的,沒有控制終端與之相連的程序。它獨立於控制終端,週期性地執行某種任務。Linux的大多數伺服器就是用守護程序的方式實現的。如web伺服器程序http等。守護程序在後臺執行,類似於Windows中的系統服務。      

Linux入門:建立守護程序

       守護程序(deamon),也稱精靈程序,是一種執行在後臺的一種特殊的程序,它獨立於控制終端並且週期性的執行某種任務或等待處理某些發生的事件。由於在Linux中,每個系統與使用者進行交流的

Unix/Linux程式設計-建立守護程序

建立守護程序 #include <fcntl.h> #include <sys/resource.h> #include <syslog.h> #include <unistd.h> #include <std

ASP.NET Core Linux下為 dotnet 建立守護程序(必備知識)

前言 在上篇文章中介紹瞭如何在 Docker 容器中部署我們的 asp.net core 應用程式,本篇主要是怎麼樣為我們在 Linux 或者 macOs 中部署的 dotnet 程式建立一個守護程序,來保證我們的程式在異常或者是電腦重啟的時候仍然能夠正常訪問。 如果你以後用準備使用 asp.net core

linux 程序建立clone、forkvfork

 目錄: 1、clone、fork與vfork介紹 2、fork說明 3、vfork說明 4、clone說明5、fork,vfork,clone的區別 內容: 1、clone、fork與vfork介

Linux守護程序列表/守護程序

  在linux或者unix作業系統中在系統引導的時候會開啟很多服務,這些服務就叫做守護程序。為了增加靈活性,root可以選擇系統開啟的模式,這些模式叫做執行級別,每一種執行級別以一定的方式配置系統。 守護程序是脫離於終端並且在後臺執行的程序。守護程序脫離於終端是為了避免程序在

Linux 多工程式設計——特殊程序:殭屍程序、孤兒程序守護程序

殭屍程序(Zombie Process) 程序已執行結束,但程序的佔用的資源未被回收,這樣的程序稱為殭屍程序。 在每個程序退出的時候,核心釋放該程序所有的資源、包括開啟的檔案、佔用的記憶體等。 但是仍然為其保留一定的資訊,這些資訊主要主要指程序控制塊的資訊(包括程序號、退出狀態、執行時

Linux 程序】孤兒程序、殭屍程序守護程序

1、孤兒程序: 孤兒程序:一個父程序退出,而它的一個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。孤兒程序是沒有父程序的程序,孤兒程序這個重任就落到了init程序身上,init程序就好像是一個民政局,專門負責處理孤兒

Linux----網路程式設計(守護程序相關概念及程式設計流程)

一、守護程序的相關定義 守護程序:也稱為精靈程序,執行在後臺的一種特殊程序。守護程序獨立於控制終端並且週期性的執行某種任務或者等待處理髮生的事件。所以守護程序不因為使用者、終端或其他的變化而受影響。 守護程序的特點:  1. 執行週期長                 

linux 程序的管理、子程序建立程序資源的回收

今天介紹程序的程序的管理,子程序建立以及程序資源的回收 首先什麼是程序? 答:程序是程式的例項。程式是靜態的,是存放在硬碟上的,程式執行起來就形成了程序。程式從磁碟到記憶體裡之後就形成了程序。 程序又分為:使用者級程序和核心級程序   我們下面瞭解使用者級程序: 作業系統為

Linux中系統服務/守護程序 (daemon) 的詳細說明

acpid acpid(Advanced Configuration and Power Interface)是為替代傳統的APM電源管理標準而推出的新型電源管理標準。通常膝上型電腦需要啟動電源進行管理。 alsasound Alsa音效卡驅動守護程式。Alsa音效卡驅動程式本來是為了一種音

linux 程序(關於守護程序、檢查一個程序是否活著、如何寫一個程序號檔案)

本文主要包括三個部分:     一是如何實現一個守護程序,二是如何檢測一個程序是否活著,三是保證某一執行檔案只有一個例項在執行。 /*  * 1.守護程序  */ 守護程序的最大特點就是脫離了中斷,Linux提供了一個系統呼叫daemon(),要想自定義實現的話,主要

建立守護程序為什麼要fork兩次

一、守護程序的基本概念: 守護程序也叫精靈程序,它是大多數伺服器的載體。守護程序是一種執行在後臺的一種特殊的程序,它獨立於控制終端並且週期性的執行某種任務或是等待處理某些發生的時間。如果想讓某個程序

Linux 中的普通程序、後臺程序守護程序

1、預設情況下,程序是在前臺執行的,這時就把 shell 給佔據了,我們再無法使用終端進行其它操作。2、對於沒有互動的程序,我們希望將其在後臺啟動,可以在命令的末尾加一個 “&” 字元實現這個目的。切換到後臺的程序稱為job。切換到後臺時會輸出相關 job 資訊,以輸

建立守護程序為什麼fork兩次

      守護程序(daemon程序)是後臺守護程序,有時候也叫精靈程序(agent).linux 下server都是daemon程序。 其特點是:   1)其父程序是一號程序,通常以d結尾   2)在後臺執行,獨立於終端,週期性的以某種任務或等待處理某些發生的事   3

python程序守護程序

標籤(空格分隔): 守護程序 主程序建立子程序,然後將該程序設定成守護自己的程序,守護程序就好比崇禎皇帝身邊的老太監,崇禎皇帝已死老太監就跟著殉葬了; 關於守護程序需要強調兩點: 其一:守護程序會在主程序程式碼執行結束後就終止 其二:守護程序內無法再開啟子程序,否則丟擲異常:Assert

Python學習的第36天程序守護程序、互斥鎖

一、守護程序: 1、守護程序: 本質就是一個"子程序",該"子程序"的生命週期<=被守護程序的生命週期,當一個程序作為守護程序時 被被守護的程序死亡時 守護程序也跟隨死亡 2、使用 from multiprocessing import Process import time def ta

併發 --- 31 程序守護程序 程序佇列

一。程序的其他方法   1.   .name      程序名   (可指定)   2.  .pid     程序號   3.   os.getpid