首頁 系統教程 Linux 剖析Linux的守護神

剖析Linux的守護神

Apr 29, 2024 pm 12:28 PM
linux linux教程 紅帽 linux系統 linux指令 linux認證 紅帽linux linux視頻

後台程式與守護程式的差異
    最大的差異有以下幾點:
  • (a)守護程式已經完全脫離終端控制台了,而後台程式並未完全脫離終端(在終端機未關閉前還是會往終端輸出結果);
  • (b)守護程式在關閉終端控制台時不會受影響,而後台程式會隨使用者退出而停止,需要在以nohup command & 格式運作才能避免影響;
  • (c)守護程式的會話群組和目前目錄,檔案描述符都是獨立的。後台運行只是終端進行了一次fork,讓程式在後台執行,這些都沒改變;

剖析Linux的守護神

#守護程式的特性

#守護程式(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
      登入後複製

       

    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
      登入後複製

       

補充 setsid() 函數函數:

如果呼叫進程已經是一個進程組的組長,則此函數會傳回錯誤。為了杜絕這種情況,通常先呼叫fork()來建立子進程,然後使其父進程終止,而子進程繼續,在子進程中呼叫此函數。

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

以上是剖析Linux的守護神的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

sublime寫好代碼後如何運行 sublime寫好代碼後如何運行 Apr 16, 2025 am 08:51 AM

在 Sublime 中運行代碼的方法有六種:通過熱鍵、菜單、構建系統、命令行、設置默認構建系統和自定義構建命令,並可通過右鍵單擊項目/文件運行單個文件/項目,構建系統可用性取決於 Sublime Text 的安裝情況。

laravel安裝代碼 laravel安裝代碼 Apr 18, 2025 pm 12:30 PM

要安裝 Laravel,需依序進行以下步驟:安裝 Composer(適用於 macOS/Linux 和 Windows)安裝 Laravel 安裝器創建新項目啟動服務訪問應用程序(網址:http://127.0.0.1:8000)設置數據庫連接(如果需要)

Linux的主要目的是什麼? Linux的主要目的是什麼? Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

git軟件安裝 git軟件安裝 Apr 17, 2025 am 11:57 AM

安裝 Git 軟件包括以下步驟:下載安裝包運行安裝包驗證安裝配置 Git安裝 Git Bash(僅限 Windows)

sublime快捷鍵怎麼使用 sublime快捷鍵怎麼使用 Apr 16, 2025 am 08:57 AM

Sublime Text 提供了提高开发效率的快捷键,包括常用的(保存、复制、剪切等)、编辑(缩进、格式化等)、导航(项目面板、文件浏览等)以及查找和替换快捷键。熟练使用这些快捷键可显著提升 Sublime 的使用效率。

See all articles