src/os/unix/ngx_daemon.c - nginx-1.7.10

Functions defined

Source code


  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #include <ngx_config.h>
  6. #include <ngx_core.h>


  7. ngx_int_t
  8. ngx_daemon(ngx_log_t *log)
  9. {
  10.     int  fd;

  11.     switch (fork()) {
  12.     case -1:
  13.         ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");
  14.         return NGX_ERROR;

  15.     case 0:
  16.         break;

  17.     default:
  18.         exit(0);
  19.     }

  20.     ngx_pid = ngx_getpid();

  21.     if (setsid() == -1) {
  22.         ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed");
  23.         return NGX_ERROR;
  24.     }

  25.     umask(0);

  26.     fd = open("/dev/null", O_RDWR);
  27.     if (fd == -1) {
  28.         ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
  29.                       "open(\"/dev/null\") failed");
  30.         return NGX_ERROR;
  31.     }

  32.     if (dup2(fd, STDIN_FILENO) == -1) {
  33.         ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");
  34.         return NGX_ERROR;
  35.     }

  36.     if (dup2(fd, STDOUT_FILENO) == -1) {
  37.         ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");
  38.         return NGX_ERROR;
  39.     }

  40. #if 0
  41.     if (dup2(fd, STDERR_FILENO) == -1) {
  42.         ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed");
  43.         return NGX_ERROR;
  44.     }
  45. #endif

  46.     if (fd > STDERR_FILENO) {
  47.         if (close(fd) == -1) {
  48.             ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");
  49.             return NGX_ERROR;
  50.         }
  51.     }

  52.     return NGX_OK;
  53. }