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 "); 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 }