Mercurial > hg > nginx
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 } |