0
|
1
|
|
2 /*
|
|
3 * Copyright (C) Igor Sysoev
|
660
|
4 * Copyright (C) Nginx, Inc.
|
0
|
5 */
|
|
6
|
|
7
|
|
8 #include <ngx_config.h>
|
|
9 #include <ngx_core.h>
|
|
10
|
|
11
|
670
|
12 ngx_int_t
|
|
13 ngx_daemon(ngx_log_t *log)
|
0
|
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 }
|