Mercurial > hg > nginx
comparison src/os/unix/ngx_process.c @ 365:fd24ba70e1b3
nginx-0.0.7-2004-06-23-09:54:27 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 23 Jun 2004 05:54:27 +0000 |
parents | 239e37d44a34 |
children | e411b1482ee3 |
comparison
equal
deleted
inserted
replaced
364:7c54d93f5965 | 365:fd24ba70e1b3 |
---|---|
21 ngx_int_t s; | 21 ngx_int_t s; |
22 | 22 |
23 s = respawn >= 0 ? respawn : ngx_last_process; | 23 s = respawn >= 0 ? respawn : ngx_last_process; |
24 | 24 |
25 | 25 |
26 /* Solaris 9 still has no AF_LOCAL */ | 26 if (respawn != NGX_PROCESS_DETACHED) { |
27 | 27 |
28 if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1) { | 28 /* Solaris 9 still has no AF_LOCAL */ |
29 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 29 |
30 "socketpair() failed while spawning \"%s\"", name); | 30 if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1) |
31 return NGX_ERROR; | 31 { |
32 } | 32 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
33 | 33 "socketpair() failed while spawning \"%s\"", name); |
34 if (ngx_nonblocking(ngx_processes[s].channel[0]) == -1) { | 34 return NGX_ERROR; |
35 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 35 } |
36 ngx_nonblocking_n " failed while spawning \"%s\"", name); | 36 |
37 return NGX_ERROR; | 37 if (ngx_nonblocking(ngx_processes[s].channel[0]) == -1) { |
38 } | 38 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
39 | 39 ngx_nonblocking_n " failed while spawning \"%s\"", |
40 if (ngx_nonblocking(ngx_processes[s].channel[1]) == -1) { | 40 name); |
41 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 41 ngx_close_channel(ngx_processes[s].channel, cycle->log); |
42 ngx_nonblocking_n " failed while spawning \"%s\"", name); | 42 return NGX_ERROR; |
43 return NGX_ERROR; | 43 } |
44 } | 44 |
45 | 45 if (ngx_nonblocking(ngx_processes[s].channel[1]) == -1) { |
46 on = 1; | 46 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
47 if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) { | 47 ngx_nonblocking_n " failed while spawning \"%s\"", |
48 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 48 name); |
49 "ioctl(FIOASYNC) failed while spawning \"%s\"", name); | 49 ngx_close_channel(ngx_processes[s].channel, cycle->log); |
50 return NGX_ERROR; | 50 return NGX_ERROR; |
51 } | 51 } |
52 | 52 |
53 if (fcntl(ngx_processes[s].channel[0], F_SETOWN, ngx_pid) == -1) { | 53 on = 1; |
54 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 54 if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) { |
55 "fcntl(F_SETOWN) failed while spawning \"%s\"", name); | 55 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
56 return NGX_ERROR; | 56 "ioctl(FIOASYNC) failed while spawning \"%s\"", name); |
57 } | 57 ngx_close_channel(ngx_processes[s].channel, cycle->log); |
58 | 58 return NGX_ERROR; |
59 ngx_channel = ngx_processes[s].channel[1]; | 59 } |
60 | |
61 if (fcntl(ngx_processes[s].channel[0], F_SETOWN, ngx_pid) == -1) { | |
62 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
63 "fcntl(F_SETOWN) failed while spawning \"%s\"", name); | |
64 ngx_close_channel(ngx_processes[s].channel, cycle->log); | |
65 return NGX_ERROR; | |
66 } | |
67 | |
68 ngx_channel = ngx_processes[s].channel[1]; | |
69 | |
70 } else { | |
71 ngx_processes[s].channel[0] = -1; | |
72 ngx_processes[s].channel[1] = -1; | |
73 } | |
74 | |
60 ngx_process_slot = s; | 75 ngx_process_slot = s; |
61 | 76 |
62 | 77 |
63 pid = fork(); | 78 pid = fork(); |
64 | 79 |
65 switch (pid) { | 80 switch (pid) { |
66 | 81 |
67 case -1: | 82 case -1: |
68 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 83 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
69 "fork() failed while spawning \"%s\"", name); | 84 "fork() failed while spawning \"%s\"", name); |
85 ngx_close_channel(ngx_processes[s].channel, cycle->log); | |
70 return NGX_ERROR; | 86 return NGX_ERROR; |
71 | 87 |
72 case 0: | 88 case 0: |
73 ngx_pid = ngx_getpid(); | 89 ngx_pid = ngx_getpid(); |
74 proc(cycle, data); | 90 proc(cycle, data); |
222 process, pid, WEXITSTATUS(status)); | 238 process, pid, WEXITSTATUS(status)); |
223 ngx_processes[i].respawn = 0; | 239 ngx_processes[i].respawn = 0; |
224 } | 240 } |
225 } | 241 } |
226 } | 242 } |
243 | |
244 | |
245 void ngx_close_channel(ngx_fd_t *fd, ngx_log_t *log) | |
246 { | |
247 if (close(fd[0]) == -1) { | |
248 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close() failed"); | |
249 } | |
250 | |
251 if (close(fd[1]) == -1) { | |
252 ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close() failed"); | |
253 } | |
254 } |