守护进程是一个很重要的概念,但本质上就是一个去除所有可知的依赖以保持独立的进程,说的再多不如动手来一遍。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <syslog.h>
void create_daemon_by_self(void)
{
pid_t pid_t1;
int ret = -1;
long fd_max = -1;
pid_t1 = fork(); //fork一个新进程
if(pid_t1 < 0)
{
perror("fork");
exit(0);
}
if(pid_t1 > 0)
{
printf("end parent process.\n"); //结束父进程
exit(0);
}
pid_t1 = setsid(); //设置新的会话
if(pid_t1 < 0)
{
perror("setsid");
exit(0);
}
ret = chdir("/"); //设置工作目录
if(ret < 0)
{
perror("chdir");
exit(0);
}
umask(0); //设置最大的文件操作权限
fd_max = sysconf(_SC_OPEN_MAX); //关闭所有的文件操作,一般关闭0,1,2就行了
for(int i = 0; i < fd_max; i++)
{
close(i);
}
open("/dev/null", O_RDWR); //把标准输入输出标准错误绑定到一个空设备
dup(0);
dup(0);
}
void create_daemon_by_daemon(void)
{
int ret = -1;
printf("Hi, create_daemon_by_daemon.\n");
ret = daemon(0, 0); //使用daemon接口创建守护进程,简单很多!!!!
if (ret != 0)
exit(0);
}
void do_something(void)
{
openlog("hello", LOG_PID | LOG_CONS, LOG_USER);
int count = 10;
while(count--)
{
sleep(1);
syslog(LOG_INFO, "hello world=%d", count);
}
closelog();
}
void do_exit(void)
{
printf("Hi, I'm exit.\n");
}
int main(int argc, char const *argv[])
{
atexit(do_exit);
// create_daemon_by_self();
create_daemon_by_daemon();
do_something();
return 0;
}