#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
void daemon_init(void)
{
pid_t pid;
// 1, 创建子进程
if((pid = fork()) < 0){
perror("fork");
exit(1);
}else if(pid)
exit(0);
// 2, 创建会话
if(setsid() < 0){
perror("setsid");
exit(1);
}
// 3, 再创建子进程
if((pid = fork()) < 0){
perror("fork");
exit(1);
}else if(pid)
exit(0);
// 4, 关闭继承父进程的文件描述符
int i,max_fd = sysconf(_SC_OPEN_MAX);
for (i = 0; i < max_fd;i++)
close(i);
// 5, 重定向标准输入,标准输入,标准错误
open("/dev/null",O_RDWR);
dup(0);
dup(0);
// 6, 设置守护进程的工作目录
chdir("/");
// 7, 消除umask影响
umask(0);
}
int main(void)
{
daemon_init(); //初始化守护进程
/*****************下面为守护进程执行的代码*******************/
//每隔一秒钟向文件中写一条时间信息
FILE *fp = fopen("1.txt","a+");
time_t tm;
char buf[100];
while(1){
time(&tm);
sprintf(buf,"%s",ctime(&tm));
fputs(buf,fp);
fflush(fp);
sleep(1);
}
return 0;
}
在linux系统中,我们可以创建一个简单的守护进程在后台执行,满足自己的程序在进行时,守护进程也同样可以启动。
守护进程(Daemon Process),也就是通常说的 Daemon 进程(精灵进程),是 Linux 中的后台服务进程。它是一个生存期较长的进程,通常独立
于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在
执行过程中的信息也不在任何终端上显示。由于在 linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依
附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。