剖析Linux的守護神
- 最大的差異有以下幾點:
- (a)守護程式已經完全脫離終端控制台了,而後台程式並未完全脫離終端(在終端機未關閉前還是會往終端輸出結果);
- (b)守護程式在關閉終端控制台時不會受影響,而後台程式會隨使用者退出而停止,需要在以nohup command & 格式運作才能避免影響;
- (c)守護程式的會話群組和目前目錄,檔案描述符都是獨立的。後台運行只是終端進行了一次fork,讓程式在後台執行,這些都沒改變;
#守護程式(Daemon)是在後台運行的一種特殊進程,它脫離於終端,從而這可避免進程被任何終端所產生的信號打斷,它在執行進程中的產生資訊也不在任何終端上顯示。守護程式週期性地執行某種任務或等待處理某些發生的事件,Linux的大多數伺服器就是用守護程式實現的。
-
- #屏蔽一些有關控制終端操作的訊號,是為了防止在守護程序沒有正常啟動起來之前,控制終端受到干擾退出或掛起。程式碼如下:
/* 处理可能的终端信号 */ signal(SIGTTOU, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGTSTP, SIG_IGN); signal(SIGHUP , SIG_IGN);
登入後複製 - 在背景運行。
/* 是父进程,结束父进程,子进程继续 */ if(fork()) exit(0);
登入後複製 - 脫離控制終端和進程組:
- (1)一個進程屬於一個進程組,進程組號(PGID)就是進程組長的進程號(PID)
- (2)同進程組中的進程共享一個控制終端,這個控制終端預設是創建進程的終端
- (3)一個進程關聯的控制終端和進程組通常是從父進程繼承下來的,因此,這個子進程仍然受到父親進程終端的影響,因為終端產生的訊號會發送給前台進程組的所有進程。
基於上述原因,需要讓為個子進程徹底擺脫該終端的影響,需要呼叫setsid()使子進程成為新的會話組長,程式碼如下:
setsid();
登入後複製setsid()呼叫成功後,呼叫此函數的程序成為新的會話組長和新的程序組長,並與原來的程序組脫離關係。由於會話過程對控制終端的獨佔性,進程同時與控制終端脫離。
- 禁止進程重新開啟控制終端,採用的辦法是再次建立一個子進程,並讓父親進程退出,該子進程不再是會話群組長,從而達到目的。程式碼如下:
/* 结束第一子进程,第二子进程继续 */ if(fork()) exit(0);
登入後複製 - 關閉開啟的檔案描述符。因為進程從創建它的父進程繼承了打開的檔案描述符,一般情況下不再需要。如不關閉,將會浪費系統資源。程式碼如下:
#define NOFILE 256 for(i=0; i
登入後複製 - 改變目前工作目錄。進程活動時,其工作目錄所在的檔案系統不能卸載。因此需要將守護程式的工作目錄改變到適當的目錄。程式碼如下:
chdir("/tmp");
登入後複製 - 重設檔案建立遮罩。進程從創建它的父進程繼承了檔案創建掩碼。它可能修改守護程式所建立的檔案的存取權限。程式碼如下:
umask(0);
登入後複製 - 處理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
登入後複製
- #屏蔽一些有關控制終端操作的訊號,是為了防止在守護程序沒有正常啟動起來之前,控制終端受到干擾退出或掛起。程式碼如下:
如果呼叫進程已經是一個進程組的組長,則此函數會傳回錯誤。為了杜絕這種情況,通常先呼叫fork()來建立子進程,然後使其父進程終止,而子進程繼續,在子進程中呼叫此函數。
如果呼叫此函數的進程不是一個進程組組長,則此函數會建立一個新會話,調用setsid()函數的進程成為新的會話的領頭進程,並與其父進程的會話組和進程組脫離。由於會話對控制終端的獨佔性,進程同時與控制終端脫離。
以上是剖析Linux的守護神的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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