我们通常在创建服务器时,希望服务器能够在后台运行。 此外,还可以记录此服务器的pid,以防止一个进程重复启动。 以前我的方案是自己使用fork函数,在后台模式下运行服务器; 然后,在启动之前,检查是否可以从配置文件中指定的pid文件中读取pid信息,以及当前ps aux中查找此pid的过程是否仍然有效。 这样判定服务器是否启动了。 正常启动完成后,当前进程的pid将写入文件。 这样可以防止重新启动。 从刚才的说明可以看出,许多服务器程序可能有以下需求:
要在后台运行,需要记录pid以方便今后读取服务器信息。 您需要确保服务器不会意外重新启动。 实际上,在Linux的基础设施中正在处理这样的命令。
$ daemonize拥有这个xndgb,所以可以减少自己学习Linux守护程序方式的编程。 编写程序时,直接实现自己服务器的主进程即可。 你最好减少这种自己代码中与平台相关的东西。 可以使代码更明确。
描述daemonize可以将命令作为Unix运行的后台。 后台程序在服务器上运行,而不通过终端或登录的shell,等待一段时间,或按固定的周期执行给定的任务。 典型的后台流程:
关闭除标准输出、输出和错误输出外的所有文件描述符
将工作目录设置为文件系统的根目录,并确保没有挂载其他文件系统以防止卸载
重置他的鼠标
在后台执行(fork ) )。
分离处理组(通常为壳)并屏蔽信号(例如挂起信号HUP );
忽略所有中断的I/O信号
从中断中分离控制权
处理SIGCLD信号
选项-a在输出文件中挂载默认值,而不是刷新默认值。 仅在指定了-e and/or -o时适用。
-e将输出标准错误重定向到指定文件。 代替/dev/null
-o将输出标准重定向到指定的文件,代替/dev/null
-E name=value将环境变量添加到后台程序中。 此参数类型必须为name=value格式。 参数可以设定多次。
定制运行-c directory命令之前的目录。
-p pidfile定制自己pid的存储位置。
-l lockfile单实例启动时检查此文件。
-u user自定义程序是作为谁运行的?
-v启动daemonize,将自己的程序执行的详细日志输出到标准输出。
注意事项如果主机操作系统提供了daemon库程序,daemonize将使用它。 否则,daemonize将使用自己实现的daemon。 这个选择是在编译时进行的。
FreeBSD 5.0引入了daemon命令,与此命令类似,但没有提供太多功能。
关于cqdxte M. Clapper,bmc@clapper.org
daemonize home page :http://software.clapper.org/daemonize /
August 2006
实例##测试代码:
# include iostream # includethreadintmain (int argn,char * argv [ ] ) (int loop _ count=0; wile(true ) { loop_count; if(loop_count10 ) { loop_count=0; } STD :3360 this _ thread :3360 sleep _ for (STD 3360: chrono 33603360 milliseconds (1000 ); if(loop_count==5) STD : cout ' isnormalizeoutput ' STD 33603360 endl; }if(loop_count==9) STD : cerr ' iserror output ' STD 3360: endl; } } return 0; } ##开始的外壳
daemonize-a-e/home/Abel/test _ daemonize/error.log-o/home/Abel/test _ daemonize/output.log-p/hog test_daemonize-cmyCFG.CFG文件列表test _ daemonize ] $ lsdaeminze.PID error.log launch.shlock filemain.CPP main.o oo daemiid output.logisnormalizeoutputisnormalizeoutput # error.logiserroroutputiserroroutput