Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ngx_daemon.c
Go to the documentation of this file.
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 
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) {
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 }