Mercurial > hg > nginx-quic
comparison src/os/unix/ngx_process.c @ 354:eaf1f651cf86
nginx-0.0.7-2004-06-15-11:55:11 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 15 Jun 2004 07:55:11 +0000 |
parents | 56496082668b |
children | 0fb6c53fb135 |
comparison
equal
deleted
inserted
replaced
353:b8d3d7dbfcc8 | 354:eaf1f651cf86 |
---|---|
4 #include <ngx_event.h> | 4 #include <ngx_event.h> |
5 | 5 |
6 | 6 |
7 static void ngx_execute_proc(ngx_cycle_t *cycle, void *data); | 7 static void ngx_execute_proc(ngx_cycle_t *cycle, void *data); |
8 | 8 |
9 ngx_uint_t ngx_last_process; | 9 ngx_int_t ngx_last_process; |
10 ngx_socket_t ngx_channel; | |
10 ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; | 11 ngx_process_t ngx_processes[NGX_MAX_PROCESSES]; |
11 | 12 |
12 | 13 |
13 ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, | 14 ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, |
14 ngx_spawn_proc_pt proc, void *data, | 15 ngx_spawn_proc_pt proc, void *data, |
15 char *name, ngx_int_t respawn) | 16 char *name, ngx_int_t respawn) |
16 { | 17 { |
18 u_long on; | |
17 ngx_pid_t pid; | 19 ngx_pid_t pid; |
20 ngx_int_t s; | |
21 | |
22 s = respawn >= 0 ? respawn : ngx_last_process; | |
23 | |
24 | |
25 /* Solaris 9 still has no AF_LOCAL */ | |
26 | |
27 if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1) { | |
28 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
29 "socketpair() failed while spawning \"%s\"", name); | |
30 return NGX_ERROR; | |
31 } | |
32 | |
33 on = 1; | |
34 if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) { | |
35 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
36 "ioctl(FIOASYNC) failed while spawning \"%s\"", name); | |
37 return NGX_ERROR; | |
38 } | |
39 | |
40 if (fcntl(ngx_processes[s].channel[0], F_SETOWN, ngx_pid) == -1) { | |
41 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | |
42 "fcntl(F_SETOWN) failed while spawning \"%s\"", name); | |
43 return NGX_ERROR; | |
44 } | |
45 | |
46 ngx_channel = ngx_processes[s].channel[1]; | |
47 | |
18 | 48 |
19 pid = fork(); | 49 pid = fork(); |
20 | 50 |
21 if (pid == -1) { | 51 switch (pid) { |
52 | |
53 case -1: | |
22 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, | 54 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, |
23 "fork() failed while spawning \"%s\"", name); | 55 "fork() failed while spawning \"%s\"", name); |
24 } | |
25 | |
26 switch (pid) { | |
27 case -1: | |
28 return NGX_ERROR; | 56 return NGX_ERROR; |
29 | 57 |
30 case 0: | 58 case 0: |
31 ngx_pid = ngx_getpid(); | 59 ngx_pid = ngx_getpid(); |
32 proc(cycle, data); | 60 proc(cycle, data); |
37 } | 65 } |
38 | 66 |
39 ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, | 67 ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, |
40 "spawn %s: " PID_T_FMT, name, pid); | 68 "spawn %s: " PID_T_FMT, name, pid); |
41 | 69 |
70 ngx_processes[s].pid = pid; | |
71 ngx_processes[s].exited = 0; | |
72 | |
42 if (respawn >= 0) { | 73 if (respawn >= 0) { |
43 ngx_processes[respawn].pid = pid; | |
44 ngx_processes[respawn].exited = 0; | |
45 return pid; | 74 return pid; |
46 } | 75 } |
47 | 76 |
48 ngx_processes[ngx_last_process].pid = pid; | 77 ngx_processes[s].proc = proc; |
49 ngx_processes[ngx_last_process].proc = proc; | 78 ngx_processes[s].data = data; |
50 ngx_processes[ngx_last_process].data = data; | 79 ngx_processes[s].name = name; |
51 ngx_processes[ngx_last_process].name = name; | 80 ngx_processes[s].exiting = 0; |
52 ngx_processes[ngx_last_process].exited = 0; | |
53 ngx_processes[ngx_last_process].exiting = 0; | |
54 | 81 |
55 switch (respawn) { | 82 switch (respawn) { |
56 | 83 |
57 case NGX_PROCESS_RESPAWN: | 84 case NGX_PROCESS_RESPAWN: |
58 ngx_processes[ngx_last_process].respawn = 1; | 85 ngx_processes[s].respawn = 1; |
59 ngx_processes[ngx_last_process].just_respawn = 0; | 86 ngx_processes[s].just_respawn = 0; |
60 ngx_processes[ngx_last_process].detached = 0; | 87 ngx_processes[s].detached = 0; |
61 break; | 88 break; |
62 | 89 |
63 case NGX_PROCESS_JUST_RESPAWN: | 90 case NGX_PROCESS_JUST_RESPAWN: |
64 ngx_processes[ngx_last_process].respawn = 1; | 91 ngx_processes[s].respawn = 1; |
65 ngx_processes[ngx_last_process].just_respawn = 1; | 92 ngx_processes[s].just_respawn = 1; |
66 ngx_processes[ngx_last_process].detached = 0; | 93 ngx_processes[s].detached = 0; |
67 break; | 94 break; |
68 | 95 |
69 case NGX_PROCESS_DETACHED: | 96 case NGX_PROCESS_DETACHED: |
70 ngx_processes[ngx_last_process].respawn = 0; | 97 ngx_processes[s].respawn = 0; |
71 ngx_processes[ngx_last_process].just_respawn = 0; | 98 ngx_processes[s].just_respawn = 0; |
72 ngx_processes[ngx_last_process].detached = 1; | 99 ngx_processes[s].detached = 1; |
73 break; | 100 break; |
74 } | 101 } |
75 | 102 |
76 ngx_last_process++; | 103 ngx_last_process++; |
77 | 104 |
104 { | 131 { |
105 int status; | 132 int status; |
106 char *process; | 133 char *process; |
107 ngx_pid_t pid; | 134 ngx_pid_t pid; |
108 ngx_err_t err; | 135 ngx_err_t err; |
109 ngx_uint_t i, one; | 136 ngx_int_t i; |
137 ngx_uint_t one; | |
110 struct timeval tv; | 138 struct timeval tv; |
111 one = 0; | 139 one = 0; |
112 | 140 |
113 for ( ;; ) { | 141 for ( ;; ) { |
114 pid = waitpid(-1, &status, WNOHANG); | 142 pid = waitpid(-1, &status, WNOHANG); |