ACE源码分析DAEMON
ACE源码分析DAEMON(1)——ACE::daemonize()
后 台服务进程不属于任何一个终端会话,当然也就不用和任何用户交互,许多系统服务由后台服务进程实施;如网络服务,打印等。Windows和UNIX在实现 后台服务进程上并不统一,Windows定义的名称为SERVICE而UNIX上的名称为Daemon。对应到ACE上,对于UNIX平台ACE提供了一 个名称为ACE::daemonize()的静态方法,进程通过调用该方法即可成为后台服务进程;而对于Windows平台,ACE提供的是一个名称为 ACE_NT_Service的类,通过调用该类的一系列方法也可成为一个后台服务进程。下面分别讨论ACE::daemonize()及 ACE_NT_Service在ACE中的实现。
ACE::daemonize(UNIX)
参考APUE,UNIX平台生成daemon进程的完整步骤共7个,ACE在实现时有一步没有做。下面结合这些步骤以及ACE的实现代码分别说明:
1.Fork出新的服务进程以便父进程退出,这样可以确保子进程不是进程组的组长
pid_t pid = ACE_OS::fork ();
if (pid == -1)
return -1;
else if (pid != 0)
ACE_OS::exit (0);
2.使用SETSID创建会话并设置子进程为进程组组长,该子进程不存在关联的控制终端
ACE_OS::setsid ();
ACE_OS::signal (SIGHUP, SIG_IGN);
3.再次Fork新的服务进程,该进程不是进程组的组长并且永远不能再次获取控制终端
pid = ACE_OS::fork (program_name);
if (pid != 0)
ACE_OS::exit (0);
4.改变当前文件系统目录,因为不做这个会导致系统管理员不能卸装(umount)一个文件系统
if (pathname != 0)
ACE_OS::chdir (pathname);
5.重新设置文件的访问属性,以便我们拥有对于我们写的任何东西的完全控制
ACE_OS::umask (0);
6.关闭所有的文件句柄
if (close_all_handles)
for (int i = ACE::max_handles () - 1; i >= 0; i--)
ACE_OS::close (i);
return 0;
另外,出于安全以及健壮性考虑,即使当前进程不使用stdin、stdout、stderr,也应重新打开0、1、2三个句柄,使之对应/dev/null。但是不知道什么原因ACE的实现代码中并没有该步骤。
转帖只为记录,感谢原创者,来自http://blog.csdn.net/cheng168520/archive/2008/11/24/3361050.aspx