Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103150994
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-17 20:32:20

  出处:linux286社区   

 设计一个linux下的deamon进程,关键只有几个:

    1.fork两次。
    2.fork第一次和第二次之间成为进程组头。
    3.改变工作目录。
    4.忽略信号。
    5.设置读写掩码。

    一下是一个从网络搜集到的例程,非常好的演示了上述要点,存此备忘。
QUOTE:

#include 
#include 
#include 
#include 

void main(int argc, char ** argv)
{
    time_t now;
    int childpid, fd, fdtablesize;
    int error, in, out;

    /*忽略终端 I/O信号,STOP信号*/
    signal(SIGTTOU,SIG_IGN);
    signal(SIGTTIN,SIG_IGN);
    signal(SIGTSTP,SIG_IGN);
    signal(SIGHUP,SIG_IGN);

    /*父进程退出,程序进入后台运行*/
    if( fork()!=0 )
    {
        exit(1);
    }
    if( setsid()<0 )
    {
        exit(1); /*创建一个新的会议组*/
    }

    /*子进程退出,孙进程失去控制终端了*/
    if( fork()!=0 )
    {
        exit(1);
    }
    if( chdir("/tmp")==-1 )
    {
        exit(1);
    }

    /*关闭打开的文件描述符,包括标准输入、标准输出和标准错误输出*/
    fd=0;
    for(fdtablesize=getdtablesize(); fd< fdtablesize;fd++)
    {
        close(fd);
    }

    umask(0);/*重设文件创建掩码*/
    signal(SIGCHLD,SIG_IGN);/*忽略SIGCHLD信号*/

    /*此处,可以做自己想做的服务例程代码。一般是一个死循环,如果要可以控制的退出的话,可以设置获取信号。下面示例一下一个写log的例程
    */

    /*写log,测试结果*/
    syslog(LOG_USER|LOG_INFO,"守护进程测试!\n");

    while(1)
    {
        time(&now);
        syslog(LOG_USER|LOG_INFO,"当前时间:\t%s\t\t\n",ctime(&now));
        sleep(6);
    }
}
  上述程序在gcc4.0.1下编译通过,在fc4-2.6.11下稳定运行。

  syslog将连接syslogd这个服务,在/var/log/message这个文件里面输出消息,所以需要启动syslogd服务。否则在/var/log/message这个文件里面不会有显示。 
阅读(221) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~