目錄
一、守護程序的引入
1、程序檢視指令ps
2、向程序發送信号指令kill
3、守護程序簡介
二、編寫簡單守護程序
1.Linux系統守護程序的建立流程:
1、背景運作
2、脫離控制終端、登入會話和程序組
3、改變目前工作目錄
4、umask設定為0以取消任何檔案權限屏蔽
5、關閉所有檔案描述符
6、将0、1、2定位到/dev/null
2、守護程序建立執行個體
一、守護程序的引入
1、程序檢視指令ps
(1)ps -ajx 偏向顯示各種有關的ID号
(2)ps -aux 偏向顯示程序各種占用資源
2、向程序發送信号指令kill
(1)kill -信号編号 程序ID,向一個程序發送一個信号
(2)kill -9 xxx,将向xxx這個程序發送9号信号,也就是要結束程序
系統有很多d結尾的程序,其中很多是守護程序。ps -aux之後可以看到。裡面有一項TTY項,他代表着”終端依賴”。
“比如pts/1”,代表着我們打開的終端視窗,顯示?的就是不依賴終端的程序。
3、守護程序簡介
守護程序(Daemon)是①運作在背景、②獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件的一種特殊程序。③守護程序常常在系統引導裝入時啟動,在系統關閉時終止。
Linux的大多數伺服器就是用守護程序實作的。比如,Internet伺服器inetd,Web伺服器httpd等
舉例:支援FTP的守護程序,syslogd系統日志,cron時間管理守護程序
二、編寫簡單守護程序
1.Linux系統守護程序的建立流程:
-
1、背景運作
為避免挂起控制終端将守護程序放入背景執行,讓程序在背景運作的方法是子程序等待父程序退出
if (pid < 0) { perror("fork"); exit(-1); } if (pid > 0) { exit(0); // 父程序直接退出,剩下的全是子程序 } |
-
2、脫離控制終端、登入會話和程序組
子程序使用setsid函數以建立新的會話期目的:脫離控制台
// 脫離控制台。 pid = setsid(); |
-
3、改變目前工作目錄
調用chdir将目前工作目錄設定為/
// 将目前程序工作目錄設定為根目錄 chdir("/"); |
-
4、umask設定為0以取消任何檔案權限屏蔽
// umask設定為0確定将來程序有最大的檔案操作權限 umask(0); |
-
5、關閉所有檔案描述符
程序從建立它的父程序那裡繼承了打開的檔案描述符。如不關閉,将會浪費系統資源,造成程序所在的檔案系統無法卸下以及引起無法預料的錯誤。
// 關閉所有檔案描述符 // 先要使用sysconf(_SC_OPEN_MAX)擷取目前系統中所允許打開的最大檔案描述符數目 int cnt = sysconf(_SC_OPEN_MAX); int i = 0; for (i=0; i<cnt; i++) { close(i); } |
-
6、将0、1、2定位到/dev/null
///dev/null 這個檔案下類似于資源回收筒 存放垃圾的地方 open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); |
2、守護程序建立執行個體
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> void create_daemon(void); int main(void) { create_daemon(); while (1) { printf("I am running.\n"); sleep(1); } return 0; } // 函數作用就是把調用該函數的程序變成一個守護程序 void create_daemon(void) { pid_t pid = 0; pid = fork(); if (pid < 0) { perror("fork"); exit(-1); } if (pid > 0) { exit(0); // 父程序直接退出 } // 執行到這裡就是子程序 //setsid将目前程序設定為一個新的會話期session,目的就是讓目前程序 // 脫離控制台。 pid = setsid(); // 将目前程序工作目錄設定為根目錄 chdir("/"); // umask設定為0確定将來程序有最大的檔案操作權限 umask(0); //先要擷取目前系統中所允許打開的最大檔案描述符數目 int cnt = sysconf(_SC_OPEN_MAX); int i = 0; for (i=0; i<cnt; i++) { close(i); } ///dev/null 這個檔案下類似于資源回收筒 存放垃圾的地方 open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); } |