博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux开发之deamon的写法
阅读量:6851 次
发布时间:2019-06-26

本文共 1512 字,大约阅读时间需要 5 分钟。

hot3.png

 

什么是demon,deamon既一个运行中后台的服务进程,不需要用户输入也不控制输出,固定的或者周期性的提供一些服务,linux系统中的一些服务例如httpd,log系统等都是系统等deamon,那该如何创建自己的deamon呢?创建deamon应该注意哪些呢?创建一个deamon都必备哪些步骤呢?

首先要先fork一个进程,为避免挂起终端,所以需要fork一个进程并且结束父进程。使程序后台执行
其次设置会话ID,setid()使进程成为组长进程
再次fork(),由于设置了一个新的会话,里面现在有一个组长进程,组长进程仍然可以控制终端,为了让程序彻底摆脱终端控制,所以需要再fork一个进程。
关闭所有文件描述符:创建的进程会继承父进程的文件描述符,如果不关闭的话会产生一些异常的问题,
将标准输入输出,错误输出定位到/dev/null中,如果不做这一部的话可能会导致打开的第一个文件描述符从0开始而导致程序的错误
fd = open("/dev/null", O_RDWR);
    if (fd == -1) {
        printf("open(\"/dev/null\") failed\n");
    }
    if (dup2(fd, STDIN_FILENO) == -1) {
        printf("dup2(STDIN) failed\n");
    }
    if (dup2(fd, STDOUT_FILENO) == -1) {
        printf("dup2(STDOUT) failed\n");
    }
    if (dup2(fd, STDERR_FILENO) == -1) {
        printf("dup2(STDERR) failed\n");
    }
    if (fd > STDERR_FILENO) {
        if (close(fd) == -1) {
            printf("close() failed\n");
            return;
        }
    }

其他的步骤可以重新设置掩码:umask(0);

下面是一个创建的例子:
int fd;
 int pid;
 int i;
 pid=fork();
   if(pid != 0)
        exit(1);
    setsid();
  pid=fork();
    if(pid != 0)
        exit(0);
    chdir("/");
    umask(0);
    long maxfd;
    if ((maxfd = sysconf(_SC_OPEN_MAX)) != -1)
    {
        for (fd = 0; fd < maxfd; fd++)
        {
            close(fd);
        }
    }
    fd = open("/dev/null", O_RDWR);
    if (fd == -1) {
        printf("open(\"/dev/null\") failed\n");
    }
    if (dup2(fd, STDIN_FILENO) == -1) {
        printf("dup2(STDIN) failed\n");
    }
    if (dup2(fd, STDOUT_FILENO) == -1) {
        printf("dup2(STDOUT) failed\n");
    }
    if (dup2(fd, STDERR_FILENO) == -1) {
        printf("dup2(STDERR) failed\n");
    }
    if (fd > STDERR_FILENO) {
        if (close(fd) == -1) {
            printf("close() failed\n");
            return;
        }
    }

    

转载于:https://my.oschina.net/u/1013544/blog/1790131

你可能感兴趣的文章
Cisco ASA5500解决内网用公网IP不能访问DMZ区服务器的
查看>>
Windows7常用命令
查看>>
crack-jar游戏之拉阔
查看>>
Java中的深拷贝和浅拷贝
查看>>
<JQuery>页面加载函数的三种写法
查看>>
大数据系列12:Hadoop2 – 全新的Hadoop
查看>>
Result相关
查看>>
关于scrolltop 兼容 IE6/7/8, Safari,FF的方法
查看>>
PRIu64宏—打印输出64位整型值
查看>>
command设计模式
查看>>
postgresql数据类型之时间类型
查看>>
virtualmin proftpd cuteftp下如何显示.开头隐藏文件
查看>>
第16章 C预处理器和C库 16.5 文件包含: #include
查看>>
关于Goertzel
查看>>
No module named mysqldb
查看>>
vue获取input输入框的数据
查看>>
Go标准库testing进行有序代码测试
查看>>
linux 常用软件安装整理
查看>>
每周总结20130829——Android异步任务
查看>>
编译原理--词法分析程序
查看>>