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);