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 }