守护进程: 也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.
它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端(通常是shell)执行。
创建守护进程流程
1. 创建子进程,父进程退出
2. 在子进程中创建新会话
3. 改变当前目录为根目录
4. 重设文件权限掩码
5. 关闭打开的文件描述符
6. 守护进程退出处理

1 #include <sys/param.h>
2 #include <unistd.h>
3 #include <signal.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8
9 void init_daemon()
10 {
11 int pid;
12 int i;
13 if(pid = fork()) exit(0); //父进程,退出
14 else if(pid < 0) exit(1); //fork失败
15
16 /* 子进程继续执行 */
17 setsid(); //创建新的会话组,子进程成为组长,并与控制终端分离
18
19 /* 防止子进程(组长)获取控制终端 */
20 if(pid = fork()) exit(0); //父进程,退出
21 else if(pid < 0) exit(1); //fork错误,退出
22
23 /* 第二子进程继续执行 , 第二子进程不再是会会话组组长*/
24 for(i = 0; i < NOFILE; i++) /* 关闭打开的文件描述符 */
25 {
26 close(i);
27 }
28 chdir("./"); /* 切换工作目录 */
29 umask(0); /* 重设文件创建掩码 */
30 return;
31 }
32
33 int main()
34 {
35 FILE *fp;
36 signal(SIGCHLD, SIG_IGN); /* 忽略子进程结束信号,防止出现僵尸进程 */
37 init_daemon();
38
39 while(1)
40 {
41 sleep(3);
42 if((fp = fopen("test.log", "a")) != NULL)
43 {
44 fprintf(fp, "%s\n", "test message");
45 fclose(fp);
46 }
47 }
48 return 0;
49 }
来源:https://www.cnblogs.com/kangbry/p/3662687.html
