Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4483582
  • 博文数量: 192
  • 博客积分: 10014
  • 博客等级: 上将
  • 技术积分: 8232
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-21 00:22
文章分类

全部博文(192)

文章存档

2011年(4)

2009年(14)

2008年(174)

我的朋友

分类: LINUX

2008-05-03 18:47:16

下面是一个简单的daemon程序示例。主要是函数daemonize()。 代码摘自Unix环境高级编程。为了简单起见,有删节。

#include <fcntl.h>
#include <sys/resource.h>
#include <signal.h>
#include <stdlib.h>

void daemonize()
{
    int i,fd0,fd1,fd2;
    pid_t pid;
    struct rlimit r1;
    struct sigaction sa;

    umask(0);

    if(getrlimit(RLIMIT_NOFILE,&r1)<0) {
    }
    if((pid=fork())<0) {
    }
    else if(pid!=0) {
        exit(0);
    }

    setsid();

/*    sa.sa_handler=SIG_IGN;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags=0;

    if(sigaction(SIGHUP,&sa,NULL)<0) {
    }

/*    if((pid=fork())<0) {
    }
    else if(pid>0) {
        exit(0);
    }
*/

    if(chdir("/")<0) {
    }

    if(r1.rlim_max==RLIM_INFINITY) {
        r1.rlim_max=1024;
    }

    for(i=0;i<r1.rlim_max;i++) {
        close(i);
    }

    fd0=open("/dev/null",O_RDWR);
    fd1=dup(0);
    fd2=dup(0);

}

int main()
{
    daemonize();

    sleep(60);

    return 0;
}



主要说明

daemon进程编程规则

(1) 首先要调用umask将文件模式创建屏蔽字设置为0
(2) 调用fork,使父进程退出
(3) 调用setsid创建一个新会话
(4) 将当前目录改变成相应的目录。主要是为了防止文件系统不能被卸载
(5) 关闭不许要的文件描述符
(6) 打开/dev/null使其具有文件描述符0 1 2。这样任何试图读标准输入、标准输出、标准错误的函数都不会起作用。
(7) 必要是应该记录系统日志

编写真正的daemon的应该考虑的东西比较多。实际上,如果就是为了看daemon进程的效果,daemonize函数只需要(2)(3)就可以了。

阅读(2010) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~