diff 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
line wrap: on
line diff
--- a/src/os/unix/ngx_process.c
+++ b/src/os/unix/ngx_process.c
@@ -6,7 +6,8 @@
 
 static void ngx_execute_proc(ngx_cycle_t *cycle, void *data);
 
-ngx_uint_t     ngx_last_process;
+ngx_int_t      ngx_last_process;
+ngx_socket_t   ngx_channel;
 ngx_process_t  ngx_processes[NGX_MAX_PROCESSES];
 
 
@@ -14,17 +15,44 @@ ngx_pid_t ngx_spawn_process(ngx_cycle_t 
                             ngx_spawn_proc_pt proc, void *data,
                             char *name, ngx_int_t respawn)
 {
+    u_long     on;
     ngx_pid_t  pid;
+    ngx_int_t  s;
+
+    s = respawn >= 0 ? respawn : ngx_last_process;
+
+
+    /* Solaris 9 still has no AF_LOCAL */
+
+    if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                      "socketpair() failed while spawning \"%s\"", name);
+        return NGX_ERROR;
+    }
+
+    on = 1;
+    if (ioctl(ngx_processes[s].channel[0], FIOASYNC, &on) == -1) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                      "ioctl(FIOASYNC) failed while spawning \"%s\"", name);
+        return NGX_ERROR;
+    }
+
+    if (fcntl(ngx_processes[s].channel[0], F_SETOWN, ngx_pid) == -1) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                      "fcntl(F_SETOWN) failed while spawning \"%s\"", name);
+        return NGX_ERROR;
+    }
+
+    ngx_channel = ngx_processes[s].channel[1];
+
 
     pid = fork();
 
-    if (pid == -1) {
+    switch (pid) {
+
+    case -1:
         ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
                       "fork() failed while spawning \"%s\"", name);
-    }
-
-    switch (pid) {
-    case -1:
         return NGX_ERROR;
 
     case 0:
@@ -39,37 +67,36 @@ ngx_pid_t ngx_spawn_process(ngx_cycle_t 
     ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,
                    "spawn %s: " PID_T_FMT, name, pid);
 
+    ngx_processes[s].pid = pid;
+    ngx_processes[s].exited = 0;
+
     if (respawn >= 0) {
-        ngx_processes[respawn].pid = pid;
-        ngx_processes[respawn].exited = 0;
         return pid;
     }
 
-    ngx_processes[ngx_last_process].pid = pid;
-    ngx_processes[ngx_last_process].proc = proc;
-    ngx_processes[ngx_last_process].data = data;
-    ngx_processes[ngx_last_process].name = name;
-    ngx_processes[ngx_last_process].exited = 0;
-    ngx_processes[ngx_last_process].exiting = 0;
+    ngx_processes[s].proc = proc;
+    ngx_processes[s].data = data;
+    ngx_processes[s].name = name;
+    ngx_processes[s].exiting = 0;
 
     switch (respawn) {
 
     case NGX_PROCESS_RESPAWN:
-        ngx_processes[ngx_last_process].respawn = 1;
-        ngx_processes[ngx_last_process].just_respawn = 0;
-        ngx_processes[ngx_last_process].detached = 0;
+        ngx_processes[s].respawn = 1;
+        ngx_processes[s].just_respawn = 0;
+        ngx_processes[s].detached = 0;
         break;
 
     case NGX_PROCESS_JUST_RESPAWN:
-        ngx_processes[ngx_last_process].respawn = 1;
-        ngx_processes[ngx_last_process].just_respawn = 1;
-        ngx_processes[ngx_last_process].detached = 0;
+        ngx_processes[s].respawn = 1;
+        ngx_processes[s].just_respawn = 1;
+        ngx_processes[s].detached = 0;
         break;
 
     case NGX_PROCESS_DETACHED:
-        ngx_processes[ngx_last_process].respawn = 0;
-        ngx_processes[ngx_last_process].just_respawn = 0;
-        ngx_processes[ngx_last_process].detached = 1;
+        ngx_processes[s].respawn = 0;
+        ngx_processes[s].just_respawn = 0;
+        ngx_processes[s].detached = 1;
         break;
     }
 
@@ -106,7 +133,8 @@ void ngx_process_get_status()
     char            *process;
     ngx_pid_t        pid;
     ngx_err_t        err;
-    ngx_uint_t       i, one;
+    ngx_int_t        i;
+    ngx_uint_t       one;
     struct timeval   tv;
     one = 0;