src/os/unix/ngx_daemon.c - nginx source code

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_parent = ngx_pid;
  21.     ngx_pid = ngx_getpid();

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

  26.     umask(0);

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

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

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

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

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

  53.     return NGX_OK;
  54. }