美文网首页
生成守护进程的函数

生成守护进程的函数

作者: 丶Em1tu0F | 来源:发表于2018-08-02 10:56 被阅读0次

改写系统调用函数:

#include <unistd.h>
int daemon(int nochdir, int noclose);

DESCRIPTION
The daemon() function is for programs wishing to detach themselves from the controlling terminal and run in the background as system daemons.
If nochdir is zero, daemon() changes the process’s current working directory to the root directory ("/");
otherwise, If noclose is zero, daemon() redirects standard input, standard output and standard error to /dev/null; otherwise, no changes are made to these file descriptors.

void daemonize(int nochdir, int noclose)
{
    pid_t pid;
    int i;
    struct rlimit rl;
    int fd0, fd1, fd2;
    
    if(getppid() == 1)
        return;
    umask(0);
    if (getrlimit(RLIMIT_NOFILE, &rl) < 0)
        exit(-1);
    if((pid = fork()) == -1)
        exit(-1);
    else if(pid > 0)
        exit(0);
    
    setsid();
    signal(SIGCHLD, SIG_IGN);
    signal(SIGTSTP, SIG_IGN);
    signal(SIGTTOU, SIG_IGN);
    signal(SIGTTIN, SIG_IGN);
    signal(SIGHUP, SIG_IGN);
    if((pid == fork()) == -1)
        exit(-1);
    else if(pid > 0)
        exit(0);
    
    if(nochdir == 0){
        if(chdir("/") < 0)
            exit(-1);
    }
    if(rl.rlim_max == RLIM_INFINITY)
         rl.rlim_max = 1024;
    if(noclose == 0){
        for(i = 0; i < rl.rlim_max; i++)
            close(i);
        fd0 = open("/dev/null", O_RDWR);
        fd1 = dup(0);
        fd2 = dup(0);
        if(fd0 != 0 || fd1 != 1 || fd2 != 2)
            exit(-1);
    }

    unmask(0);

}

getrlimit(RLIMIT_NOFILE, &rl)函数获取进程可打开的最大文件数+1。
RLIM_INFINITY 用来表示不对资源限制;

内核默认的硬限制rlim_max = 1024;

if(rl.rlim_max == RLIM_INFINITY)
         rl.rlim_max = 1024;
    if(noclose == 0){
        for(i = 0; i < rl.rlim_max; i++)
            close(i);

代码中即关闭从父进程继承下来的所有文件描述符。

相关文章

  • 生成守护进程的函数

    改写系统调用函数: DESCRIPTIONThe daemon() function is for program...

  • rsync服务企业应用

    守护进程服务企业应用: 守护进程多模块功能配置 守护进程的排除功能实践 守护进程来创建备份目录 守护进程的访问控制...

  • Python多进程

    守护进程 守护进程其实就是“子进程“是否伴随主进程一起结束:守护==>伴随,即守护进程会伴随主进程的代码运行完毕后...

  • 守护进程和守护线程详解

    守护进程 什么是守护进程? 守护进程会在主进程代码运行结束的情况下,立即挂掉。 守护进程本身就是一个子进程。 主进...

  • Docker 远程管理

    默认情况下,Docker守护进程会生成一个 /var/run/docker.sock 文件来进行本地进程通信,而不...

  • 4.5、守护进程及信号处理实战

    1、守护进程功能的实现守护进程融入项目,解放终端。相关配置:Daemon = 1;按照守护进程的方式运行守护进程如...

  • PHP创建守护进程

    PHP 创建守护进程 执行守护进程

  • 进程守护进程

    什么是守护进程?Linux 的大多数服务器就是用守护进程实现的,使用ps -axj可以查看守护进程: 守护进程基本...

  • forever

    start:启动守护进程stop:停止守护进程stopall:停止所有的forever进程restart:重启守护...

  • redis.conf详解之daemonize

    用法 作为非守护进程运行 作为守护进程运行 注意事项: 默认情况下,Redis不作为守护进程运行。如果以守护进程运...

网友评论

      本文标题:生成守护进程的函数

      本文链接:https://www.haomeiwen.com/subject/cthrvftx.html