(引)并发网络编程学习之路(三):多线程与进线池
(原)ubuntu 9.10 安装 asio库

(转)LINUX 网络编程之Daemon设计

孔令春 posted @ 2009年10月21日 23:41 in 网络安全 with tags DAEMON , 3044 阅读

引言

通常一个服务端程序是不会在前台运行的,而是作为系统服务在后台运行,并随系统启动而启动。这就是我们常说的Daemon程序,又称为守护进程,这种程序由于没有控制终端是无法与前台交互的,但我们随时可以通过系统日志来查看它的状态。下面将讲述在Linux下编写Daemon程序的步骤,并给出了例子程序。

Daemon设计步骤

Daemon程序设计主要步骤包括:

(1)       程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID

(2)       调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)

(3)       设置文件创建mask0,避免创建文件时权限的影响。

(4)       关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDINSTDOUTSTDERR。其它根据实际情况处理。

(5)       Daemon无法输出信息,可以使用SYSLOG或自己的日志系统进行日志处理。(可选)

(6)       编写管理DaemonSHELL脚本,使用serviceDaemon进行管理和监控。(可选)

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


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter