将一个进程变为一个守护进程:
(1)子进程等待父进程死亡
(2)子进程使用setsid创建新的会话期,脱离控制台
(3)调用chdir将当前工作目录设置为/,脱离文件系统
(4)umask设置为0以取消任何文件的权限屏蔽,使权限最大
(5)关闭所有文件描述符(先要通过函数sysconf()来获取系统最大的文件打开数)
(6)将0,1,2定位到/dev/null(将标准输入,标准输出,标准错误弄到回收站)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7
8 void create_daemon(void)//将一般进程变为守护进程
9 {
10 pid_t pid = 0;
11 pid = fork();//创建子进程
12 if(pid<0)
13 {
14 perror("fork");
15 exit(-1);
16 }
17 else if (pid > 0)
18 {
19 printf("this is parent progress");
20 exit(-1);
21 }
22 else if (pid == 0)
23 {
24 pid = setsid();//子进程脱离控制台创建新的会话期
25 if(pid < 0)
26 {
27 perror("setsid");
28 }
29 chdir("/");//脱离文件系统
30 umask(0);//用umas函数取消任何文件的权限屏蔽
31 int i = sysconf(_SC_OPEN_MAX);//得到系统最大的文件描述符个数
32 for (;i>0;i--)//关闭所有文件描述符
33 {
34 close(i);
35 }
36 open("/dev/null",O_RDWR);//将0,1,2定位到/dev/null
37 open("/dev/null",O_RDWR);
38 open("/dev/null",O_RDWR);
39 }
40 }
41 int main(void)/*change a progress to a daemon*/
42 {
43 create_daemon();
44 while(1)
46 printf("ok\n");
47 sleep(1);
48 }
49 return 0;
50 }
结果: