comparison src/os/unix/ngx_process.c @ 191:71ce40b3c37b

nginx-0.0.1-2003-11-19-19:26:41 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 19 Nov 2003 16:26:41 +0000
parents
children 8dee38ea9117
comparison
equal deleted inserted replaced
190:02a715e85df1 191:71ce40b3c37b
1
2 #include <ngx_config.h>
3 #include <ngx_core.h>
4
5
6 void testone(ngx_log_t *log)
7 {
8 ngx_log_debug(log, "child process");
9 ngx_msleep(5000);
10 exit(0);
11 }
12
13
14 int ngx_spawn_process(ngx_log_t *log)
15 {
16 pid_t pid;
17 sigset_t set, oset;
18
19 sigemptyset(&set);
20 sigaddset(&set, SIGCHLD);
21 if (sigprocmask(SIG_BLOCK, &set, &oset) == -1) {
22 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "sigprocmask() failed");
23 }
24
25 pid = fork();
26
27 if (pid == -1 || pid == 0) {
28 if (sigprocmask(SIG_SETMASK, &oset, &set) == -1) {
29 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
30 "sigprocmask() failed");
31 }
32 }
33
34 switch (pid) {
35 case -1:
36 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "fork() failed");
37 return NGX_ERROR;
38
39 case 0:
40 testone(log);
41 break;
42
43 default:
44 }
45
46 ngx_log_debug(log, "parent process, child: " PID_FMT _ pid);
47
48 /* book keeping */
49
50 if (sigprocmask(SIG_SETMASK, &oset, &set) == -1) {
51 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "sigprocmask() failed");
52 }
53
54 return NGX_OK;
55 }
56
57
58 void ngx_sigchld_handler(int signo)
59 {
60 int status, one;
61 pid_t pid;
62 ngx_err_t err;
63 struct timeval tv;
64
65 ngx_gettimeofday(&tv);
66
67 if (ngx_cached_time != tv.tv_sec) {
68 ngx_cached_time = tv.tv_sec;
69 ngx_time_update();
70 }
71
72 one = 0;
73
74 for ( ;; ) {
75 pid = waitpid(-1, &status, WNOHANG);
76
77 if (pid == 0) {
78 return;
79 }
80
81 if (pid == -1) {
82 err = ngx_errno;
83
84 if (err == NGX_EINTR) {
85 continue;
86 }
87
88 if (err == NGX_ECHILD && one) {
89 return;
90 }
91
92 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, errno,
93 "waitpid() failed");
94 return;
95 }
96
97 one = 1;
98
99 ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,
100 "process " PID_FMT " exited with code %d", pid, status);
101
102 /* TODO: restart handler */
103
104 #if 0
105 ngx_msleep(2000);
106 #endif
107
108 #if 0
109 ngx_spawn_process(ngx_cycle->log);
110 #endif
111 }
112 }