守護進程是Linux中的後臺服務進程,通常獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件,一般採用以d結尾的名字
特點:沒有控制終端,不能直接和用戶交互,不受用戶登錄、註銷的影響,一直在運行着。
下面通過功能爲將系統時間每間隔10s輸出到指定文件中的守護進程代碼,說明創建守護進程的模型
1 #include<stdio.h>
2 #include<wait.h>
3 #include<fcntl.h>
4 #include<sys/types.h>
5 #include<stdlib.h>
6 #include<unistd.h>
7 #include<sys/stat.h>
8 void mydaemond(void)
9 {
10 pid_t pid;
11 int ret;
12 pid = fork();//1.創建子進程,因爲進程組組長不能建立新會話,一般父進程爲進程組組長所以需要創建子進程
13 if(pid < 0)
14 {
15 perror("fork error");
16 exit(1);
17 }
18 if(pid > 0)
19 {
20 exit(0);
21 }
22 pid = setsid();//2.子進程創建新新會話,守護進程無控制端,建立會話可脫離控制端。
23
24 ret = chdir("/home/ubuntu/");//3.改變進程的工作目錄,防止其工作在可脫離的文件系統下。
25 if(ret == -1)
26 {
27 perror("chdir error");
28 exit(1);
29 }
30
31 umask(00002);//4.指定文件掩碼
32
33 //5.關閉0/1/2文件描述符,因爲守護進程脫離控制端,用不上0/1/2文件描述,所以需要將佔有的文件描述釋放
34 //但是內核分配文件描述符是按最小的來分配,如果close關閉的話,會將0/1/2分配出來,但是我們一般習慣把0/1/2當作標準輸入/標準輸出/標準錯誤輸出
35 //所以我們一般將0/1/2文件描述符dup2到/dev/null黑洞中。
36 close(0);
37 int fd = open("/dev/null",O_RDWR);
38 dup2(fd,STDOUT_FILENO);
39 dup2(fd,STDERR_FILENO);
40 }
41 int main(void)
42 {
43 mydaemond();
44 //6.守護進程主邏輯
45 while(1)
46 {
47 sleep(10);
48 pid_t pid;
49 pid = fork();
50 if(pid == -1)
51 {
52 perror("fork error");
53 exit(1);
54 }
55 else if(pid == 0)
56 {
57 int fd = open("/home/ubuntu/text/date.txt",O_WRONLY | O_APPEND | O_CREAT,0644);
58 if(fd == -1)
59 {
60 perror("open error");
61 exit(1);
62 }
63 dup2(fd,STDOUT_FILENO);
64 execlp("date","date",NULL);
65 }
66 else if(pid > 0)
67 {
68 while( waitpid(0,NULL,WUNTRACED) > 0);
69 }
70 }
71 return 0;
72 }
過一段時間查看指定文件的內容