什么是deamon,deamon既一个运行中后台的服务进程,不需要用户输入也不控制输出,固定的或者周期性的提供一些服务,linux系统中的一些服务例如httpd,log系统等都是系统等deamon,那该如何创建自己的deamon呢?创建deamon应该注意哪些呢?创建一个deamon都必备哪些步骤呢?
首先要先fork一个进程,为避免挂起终端,所以需要fork一个进程并且结束父进程。使程序后台执行
其次设置会话ID,setid()使进程成为组长进程
再次fork(),由于设置了一个新的会话,里面现在有一个组长进程,组长进程仍然可以控制终端,为了让程序彻底摆脱终端控制,所以需要再fork一个进程。
关闭所有文件描述符:创建的进程会继承父进程的文件描述符,如果不关闭的话会产生一些异常的问题,
将标准输入输出,错误输出定位到/dev/null中,如果不做这一部的话可能会导致打开的第一个文件描述符从0开始而导致程序的错误
fd = open("/dev/null", O_RDWR);
if (fd == -1) {
printf("open(\"/dev/null\") failed\n");
}
if (dup2(fd, STDIN_FILENO) == -1) {
printf("dup2(STDIN) failed\n");
}
if (dup2(fd, STDOUT_FILENO) == -1) {
printf("dup2(STDOUT) failed\n");
}
if (dup2(fd, STDERR_FILENO) == -1) {
printf("dup2(STDERR) failed\n");
}
if (fd > STDERR_FILENO) {
if (close(fd) == -1) {
printf("close() failed\n");
return;
}
}
其他的步骤可以重新设置掩码:umask(0);
下面是一个创建的例子:
int fd;
int pid;
int i;
pid=fork();
if(pid != 0)
exit(1);
setsid();
pid=fork();
if(pid != 0)
exit(0);
chdir("/");
umask(0);
long maxfd;
if ((maxfd = sysconf(_SC_OPEN_MAX)) != -1)
{
for (fd = 0; fd < maxfd; fd++)
{
close(fd);
}
}
fd = open("/dev/null", O_RDWR);
if (fd == -1) {
printf("open(\"/dev/null\") failed\n");
}
if (dup2(fd, STDIN_FILENO) == -1) {
printf("dup2(STDIN) failed\n");
}
if (dup2(fd, STDOUT_FILENO) == -1) {
printf("dup2(STDOUT) failed\n");
}
if (dup2(fd, STDERR_FILENO) == -1) {
printf("dup2(STDERR) failed\n");
}
if (fd > STDERR_FILENO) {
if (close(fd) == -1) {
printf("close() failed\n");
return;
}
}
网友评论