zoukankan      html  css  js  c++  java
  • 服务器程序后台化以及守护进程的编写规范

    一般的服务器程序都是以后台进程(守护进程)的方式运行,那么要如何使得服务器进程后台化呢?

    下面介绍守护进程的编写遵循的步骤:

    1. 创建子进程,关闭父进程;2. 设置文件权限掩码。当进程创建新文件(使用open(const char *pathname, int flags, mode_t mode)系统调用时,文件的权限将是mode&0777;

    3. 创建新会话,设置本进程为进程组的首领;

    4. 切换工作目录;

    5. 关闭标准输入设备、标准输出设备和标准错误输出设备;

    6. 关闭其他已经打开的文件描述符;

    7. 将标准输入、标准输出、标准错误重定向到/dev/null文件

    下面是一个例子:

    bool daemonize()
    {
        pid_t pid = fork();
        if ( pid < 0 )
        {
            return false;
        }
        else if ( pid > 0 )
        {
            exit( 0 );
        }
    
        umask( 0 );
    
        pid_t sid = setsid();
        if ( sid < 0 )
        {
            return false;
        }
    
        if ( ( chdir( "/" ) ) < 0 )
        {
            /* Log the failure */
            return false;
        }
    
        close( STDIN_FILENO );
        close( STDOUT_FILENO );
        close( STDERR_FILENO );
    
        open( "/dev/null", O_RDONLY );
        open( "/dev/null", O_RDWR );
        open( "/dev/null", O_RDWR );
        return true;
    }

     实际上,Linux提供了完成同样功能的库函数:

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

    其中,nochdir参数用于制定是否改变工作目录,如果nochdir = 0,则工作目录将被设置为根目录(/),否则继续使用当前工作目录。

    noclose = 0时,标准输入、标准输出、标准错误都被重定向到/dev/null文件,否则依然使用原来的设备。

    成功返回0,失败返回-1

  • 相关阅读:
    npm publish 失败可能的原因记录
    nodejs版实现properties后缀文件解析
    CSS 毛玻璃效果
    echarts markLine 辅助线非直线设置
    sql 数据类型 建表时如何选择数据类型
    用row_nuber 分页的存储过程
    错误描述:未能找到路径“C:/”的一部分
    设置VS2010默认以管理员权限启动
    通过做nopcommerce电商项目对EF的理解(一)
    获取多表联合查询的存储过程。
  • 原文地址:https://www.cnblogs.com/wiessharling/p/4105956.html
Copyright © 2011-2022 走看看