上一篇文章介绍了守护进程的创建过程。其实在linux系统中提供了daemon()函数,用于创建守护进程,原理与上一篇的介绍一样。
作用:使程序以守护进程的方式后台运行。
原型:
-
#include <unistd.h>
-
-
int daemon(int nochdir, int noclose);
参数:
当 nochdir = 0时,当前目录变为根目录("/"),否则不变;
当 noclose = 0时,标准输入、标准输出和错误输出重导向为/dev/null,也就是不输出任何信 息,否则照样输出。
返回值:
deamon()调用了fork(),如果fork成功,那么父进程就调用_exit(0)退出,所以看到的错误信息 全部是子进程产生的。如果成功函数返回0,否则返回-1并设置errno。
函数源代码(glibc-2.17):
-
int
-
daemon(nochdir, noclose)
-
int nochdir, noclose;
-
{
-
int fd;
-
-
switch (__fork()) { // 创建子进程
-
case -1:
-
return (-1);
-
case 0:
-
break;
-
default:
-
_exit(0); // 父进程退出
-
}
-
-
if (__setsid() == -1) // 调用setsid()函数
-
return (-1);
-
-
if (!nochdir)
-
(void)__chdir("/"); // 设置当前工作目录为根目录
-
-
if (!noclose) {
-
struct stat64 st;
-
/* 打开/dev/null 设备,并检查是不是字符设备及设备号 */
-
if ((fd = open_not_cancel(_PATH_DEVNULL, O_RDWR, 0)) != -1
-
&& (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0)
-
== 0)) {
-
if (__builtin_expect (S_ISCHR (st.st_mode), 1) != 0
-
#if defined DEV_NULL_MAJOR && defined DEV_NULL_MINOR
-
&& (st.st_rdev
-
== makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR))
-
#endif
-
) {
-
// 重定向输入、输出、错误描述符到/dev/null
-
(void)__dup2(fd, STDIN_FILENO);
-
(void)__dup2(fd, STDOUT_FILENO);
-
(void)__dup2(fd, STDERR_FILENO);
-
if (fd > 2)
-
(void)__close (fd);
-
} else {
-
/* We must set an errno value since no
-
function call actually failed. */
-
close_not_cancel_no_status (fd); // 关闭fd
-
__set_errno (ENODEV); // 错误则设置errno
-
return -1;
-
}
-
} else {
-
close_not_cancel_no_status (fd);// 关闭fd
-
return -1;
-
}
-
}
-
return (0);
-
}
使用:
-
#include <unsitd.h>
-
-
int main()
-
{
-
daemon(0, 0); //参数根据需求确定
-
/* 业务处理流程 */
-
}
程序编写完成后,可以通过shell命令进行启动、停止、重启等操作。类似于vsftpd的管理,下面将介绍如何通过shell进行服务的管理。
阅读(3298) | 评论(0) | 转发(0) |