69 lines
1.4 KiB
C
69 lines
1.4 KiB
C
#include "system.h"
|
|
|
|
int run_daemon(void)
|
|
{
|
|
int fd;
|
|
|
|
switch (fork())
|
|
{
|
|
// 失败
|
|
case -1:
|
|
LOG_ERROR("Failed at fork(), %d: %s", errno, strerror(errno));
|
|
return -1;
|
|
// 子进程
|
|
case 0:
|
|
break;
|
|
// 父进程
|
|
default:
|
|
exit(0);
|
|
}
|
|
|
|
if (setsid() == -1)
|
|
{
|
|
LOG_ERROR("Failed at setsid(), %d: %s", errno, strerror(errno));
|
|
return -1;
|
|
}
|
|
|
|
umask(0);
|
|
|
|
// 以读写模式打开 /dev/null
|
|
fd = open("/dev/null", O_RDWR);
|
|
if (fd == -1)
|
|
{
|
|
LOG_ERROR("Failed at open(/dev/null), %d: %s", errno, strerror(errno));
|
|
return -1;
|
|
}
|
|
|
|
// 将标准输入关联到 /dev/null
|
|
if (dup2(fd, STDIN_FILENO) == -1)
|
|
{
|
|
LOG_ERROR("Failed at dup2(STDIN_FILENO), %d: %s", errno, strerror(errno));
|
|
return -1;
|
|
}
|
|
|
|
// 将标准输出关联到 /dev/null
|
|
if (dup2(fd, STDOUT_FILENO) == -1)
|
|
{
|
|
LOG_ERROR("Failed at dup2(STDOUT_FILENO), %d: %s", errno, strerror(errno));
|
|
return -1;
|
|
}
|
|
|
|
// 将标准错误关联到 /dev/null
|
|
if (dup2(fd, STDERR_FILENO) == -1)
|
|
{
|
|
LOG_ERROR("Failed at dup2(STDERR_FILENO), %d: %s", errno, strerror(errno));
|
|
return -1;
|
|
}
|
|
|
|
// 关闭 /dev/null 的文件句柄
|
|
if (fd > STDERR_FILENO)
|
|
{
|
|
if (close(fd) == -1)
|
|
{
|
|
LOG_ERROR("Failed at close(), %d: %s", errno, strerror(errno));
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
} |