(转)LINUX 网络编程之Daemon设计
引言
通常一个服务端程序是不会在前台运行的,而是作为系统服务在后台运行,并随系统启动而启动。这就是我们常说的Daemon程序,又称为守护进程,这种程序由于没有控制终端是无法与前台交互的,但我们随时可以通过系统日志来查看它的状态。下面将讲述在Linux下编写Daemon程序的步骤,并给出了例子程序。
Daemon设计步骤
Daemon程序设计主要步骤包括:
(1) 程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID。
(2) 调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。
(3) 设置文件创建mask为0,避免创建文件时权限的影响。
(4) 关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。
(5) Daemon无法输出信息,可以使用SYSLOG或自己的日志系统进行日志处理。(可选)
(6) 编写管理Daemon的SHELL脚本,使用service对Daemon进行管理和监控。(可选)
Daemon程序框架
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <time.h> #include <strings.h> #include <string.h> #include <errno.h> int myprod(int port); int init_daemon(void); int main(int argc,char *argv[]) { if(argc != 2) { printf("please input ./mytelnetd <port>\n"); exit(1); } //转入后台 init_daemon(); //启动服务器 myprod(atoi(argv[1])); } int myprod(int port) { //你的服务器端程序 } //初始化后台环境 int init_daemon(void) { pid_t pid; int i; /* parent exits , child continues */ if((pid = fork()) < 0) return -1; else if(pid != 0) exit(0); setsid(); /* become session leader */ for(i=0;i< 3 ;++i) /* close STDOUT, STDIN, STDERR, */ close(i); umask(0); /* clear file mode creation mask */ return 0; }
程序运行后,前台终端会立即释放,但你可以用ps -e来查看。当然这个程序框架只演示了上面的前4步,下面两步我没看明白,你可以参考原文:http://blog.csdn.net/liuben/archive/2008/03/21/2204418.aspx