守护进程:
daemon进程。通常运行与操作系统后台,脱离控制终端。
一般不与用户直接交互。周期性的等待某个事件发生或周期性执行某一动作。
不受用户登录注销影响。通常采用以d结尾的命名方式。
守护进程创建步骤:
1. fork子进程,让父进程终止。
2. 子进程调用 setsid() 创建新会话
3. 通常根据需要,改变工作目录位置 chdir(), 防止目录被卸载。
4. 通常根据需要,重设umask文件权限掩码,影响新文件的创建权限。 022 -- 755 0345 --- 432 r---wx-w- 422
5. 通常根据需要,关闭/重定向 文件描述符
6. 守护进程 业务逻辑。while()
创建守护进程
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
void sys_err(const char *str)
{
perror(str);
exit(1);
}
int main(int argc, char *argv[])
{
pid_t pid;
int ret, fd;
pid = fork();
if (pid > 0)
exit(0);
pid = setsid();
if (pid == -1)
sys_err("setsid error");
ret = chdir("/home");
if (ret == -1)
sys_err("chdir error");
umask(0022);
close(STDIN_FILENO);
fd = open("/dev/null", O_RDWR);
if (fd == -1)
sys_err("open error");
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
while (1){
}
return 0;
}