ngx_daemon.c revision e18a033b
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
5 */
6
7
8#include <ngx_config.h>
9#include <ngx_core.h>
10
11
12ngx_int_t
13ngx_daemon(ngx_log_t *log)
14{
15    int  fd;
16
17    switch (fork()) {
18    case -1:
19        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");
20        return NGX_ERROR;
21
22    case 0:
23        break;
24
25    default:
26        exit(0);
27    }
28
29    ngx_pid = ngx_getpid();
30
31    if (setsid() == -1) {
32        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed");
33        return NGX_ERROR;
34    }
35
36    umask(0);
37
38    fd = open("/dev/null", O_RDWR);
39    if (fd == -1) {
40        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
41                      "open(\"/dev/null\") failed");
42        return NGX_ERROR;
43    }
44
45    if (dup2(fd, STDIN_FILENO) == -1) {
46        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");
47        return NGX_ERROR;
48    }
49
50    if (dup2(fd, STDOUT_FILENO) == -1) {
51        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");
52        return NGX_ERROR;
53    }
54
55#if 0
56    if (dup2(fd, STDERR_FILENO) == -1) {
57        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed");
58        return NGX_ERROR;
59    }
60#endif
61
62    if (fd > STDERR_FILENO) {
63        if (close(fd) == -1) {
64            ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");
65            return NGX_ERROR;
66        }
67    }
68
69    return NGX_OK;
70}
71