在Linux系統中,守護進程是非常重要的。如果您需要運行一個無人值守的任務或需要在後台運行的進程,那麼將此任務轉化為守護進程可能是最佳方式之一。
一、何為Linux守護進程
Linux進程是一種正在執行的程序,而Linux守護進程是在後台運行的進程,能夠在系統啟動時自動啟動。它會一直運行直到系統關閉或手動終止進程。守護進程是Linux下非常重要的組成部分,因為許多服務需要以守護進程的形式運行。例如,Web服務器、FTP服務器、數據庫等等。
比如,剛安裝完MySQL服務器,雖然我們可以通過命令`mysqld`來啟動它,但是我們只要一關閉終端就會發現MySQL也一起被關閉了。如果我們需要MySQL一直運行在後台,那麼就需要將其轉化為一個守護進程。
二、Linux守護進程實現
創建一個Linux守護進程可以有很多方法。下面是一種實現方式:
#include #include #include #include #include int main() { pid_t pid, sid; pid = fork(); if (pid 0) { exit(EXIT_SUCCESS); } umask(0); sid = setsid(); if (sid < 0) { exit(EXIT_FAILURE); } if ((chdir("/")) < 0) { exit(EXIT_FAILURE); } close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); while (1) { //守護進程的主循環 } exit(EXIT_SUCCESS); }
三、Linux守護進程實現過程詳解
1、fork()
調用fork()函數,創建一個子進程。父進程將子進程的PID返回,如果出現錯誤,則返回-1。在我們的例子中,我們使用fork()來創建一個新的進程,用來執行我們的守護進程。
pid = fork(); if (pid 0) { exit(EXIT_SUCCESS); }
在這裡,我們先檢查了fork()返回值的大小,如果出現錯誤則退出。接着,父進程通過調用exit()退出進程,而子進程則可以繼續執行下去。
2、setsid()
調用setsid()函數,創建一個新的會話。setsid()會啟動一個新的會話,並將調用進程設置為會話的領頭進程。
sid = setsid(); if (sid < 0) { exit(EXIT_FAILURE); }
3、umask()
調用umask()來設置文件的權限掩碼,它將來要用來疊加權限掩碼。umask(0)表示允許所有權限。
umask(0);
4、chdir()
調用chdir()來改變進程工作目錄到根目錄。保證它不會妨礙我們的守護進程運行。
if ((chdir("/")) < 0) { exit(EXIT_FAILURE); }
5、關閉標準I/O
守護進程能夠在後台執行,其原因正是因為該進程和終端分離。也就是說,它不能有標準輸入、輸出和錯誤輸出。我們通過調用close()函數來關閉所有的標準I/O,防止它和終端進行交互。
close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO);
6、主循環
在守護進程的主循環中,我們可以執行我們所需要的任務。這裡只是演示了一個無限循環的例子。
while (1) { //守護進程的主循環 }
四、總結
有了這些基本的了解和代碼實現,我們現在可以開始創建我們自己的守護進程。不過,需要注意的是,變成守護進程並不是萬能的,我們需要深入了解它的限制。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/187447.html