nginx学习十三 初始fork和nginx守护进程ngx_daemon

这篇文章主要介绍了nginx的守护进程创建与fork函数的工作原理。通过学习,了解了子进程如何从父进程继承属性,以及如何创建无终端的守护进程。内容涵盖了进程的复制、父子进程之间的关系以及守护进程创建的步骤。
摘要由CSDN通过智能技术生成

学习nginx已经有一个多月了,觉得越来越吃力了,主要原因自己总结了一下:1平台是基于linux的,以前几乎没有接触过linux,而nginx使用了很多linux的函数;2就是进程,这个东西接触的也很少,linux的多进程更不用说,而现在正好看到这里,觉得异常的吃力,这不看到nginx守护进程的建立,就找资料好好学习一下,所以本文已学习fork为主要内容。

好了,先看一下nginx的守护进程的建立,然后在学习fork。

http://blog.csdn.net/xiaoliangsky/article/details/39998373

1nginx的守护进程

直接看代码:

ngx_int_t ngx_daemon(ngx_log_t *log)
{
    int  fd;

    switch (fork()) {//用fork创建守护进程
    case -1://fork返回-1创建失败
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");
        return NGX_ERROR;

    case 0://子进程返回
        break;

    default://父进程返回
        exit(0);//父进程退出
    }

    ngx_pid = ngx_getpid();

    if (setsid() == -1) {//建立新的会话,然后子进程称为会话组长
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed");
        return NGX_ERROR;
    }

    umask(0);//重设文件创建掩模

    /*重定向标准输入、输出到/dev/null(传说中的黑洞)*/
    fd = open("/dev/null", O_RDWR);
    if (fd == -1) {
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
                      "open(\"/dev/null\") failed");
        return NGX_ERROR;
    }

    if (dup2(fd, STDIN_FILENO) == -1) {//输入重定向到fd,即从/dev/null输入
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");
        return NGX_ERROR;
    }

    if (dup2(fd, STDOUT_FILENO) == -1) {//输出重定向到fd,即所有输出到/dev/null
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");
        return NGX_ERROR;
    }

#if 0
    if (dup2(fd, STDERR_FILENO) == -1) {
        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed");
        return NGX_ERROR;
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值