Linux-编写简单守护进程

1、任何一个进程都可以将自己实现成一个守护进程

2、create_daemon函数要素

(1)、子进程要等待父进程退出

(2)、子进程使用setsid创建新的会话期,脱离控制台

(3)、调用chdir将当前工作目录设置为/

(4)、umask设置为0以取消任何文件权限屏蔽

(5)、关闭所有文件描述符

(6)、将进程0、1、2定位到/dev/null

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <stdlib.h>
 4 #include <sys/types.h>
 5 #include <sys/stat.h>
 6 #include <fcntl.h>
 7 void creat_daemon(void);
 8 int main(void)
 9 {
10     creat_daemon();
11     while()
12     {
13         printf(" i am running\n");
14         sleep();
15     }
16     
17     return 0;
18 }
19 
20 void creat_daemon(void)
21 {
22     pid_t pid =0;
23     
24     pid = fork();
25     if(pid < 0)
26     {
27         perror("fork");
28         exit(-1);
29     }
30     if(pid > 0)
31     {
32         exit(0);    //父进程直接退出
33     }
34     //能够执行到到这里的就是子进程了
35     
36     //setsid将当前进程设置为一个新的会话期session,
37     //目的就是让当前进程脱离控制台
38     pid = setsid();
39     if(pid < 0)
40     {
41         perror("setsid");
42         exit(-1);
43     }
44     //将当前进程工作目录设置为根目录
45     chdir("/");
46     //umask设置为0确保将来进程有最大的文件操作权限
47     umask(0);
48     //关闭所有文件描述符
49     //先要获取当前系统中所允许打开的最大文件描述符数目
50     int cnt = sysconf(_SC_OPEN_MAX);
51     int i = 0;
52     for(i = 0; i < cnt; i++)
53     {
54         close(i);
55     }
56     open("/dev/null", O_RDWR);//打开进程0,将其定位到/dev/null
57     open("/dev/null", O_RDWR);//打开进程1,将其定位到/dev/null
58     open("/dev/null", O_RDWR);//打开进程2,将其定位到/dev/null
59 }