diff options
author | Igor Sysoev <igor@sysoev.ru> | 2003-11-19 16:26:41 +0000 |
---|---|---|
committer | Igor Sysoev <igor@sysoev.ru> | 2003-11-19 16:26:41 +0000 |
commit | 160d774afcf3cdd4f999489211eb9d78bf82439a (patch) | |
tree | 59227d2698d9c531808a9f3edb708f36707a37f9 /src/os/unix/ngx_process.c | |
parent | 1b138ed141c0bdb0c9944c1ae70e53682ed2d035 (diff) | |
download | nginx-160d774afcf3cdd4f999489211eb9d78bf82439a.tar.gz nginx-160d774afcf3cdd4f999489211eb9d78bf82439a.zip |
nginx-0.0.1-2003-11-19-19:26:41 import
Diffstat (limited to 'src/os/unix/ngx_process.c')
-rw-r--r-- | src/os/unix/ngx_process.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c new file mode 100644 index 000000000..e487151ef --- /dev/null +++ b/src/os/unix/ngx_process.c @@ -0,0 +1,112 @@ + +#include <ngx_config.h> +#include <ngx_core.h> + + +void testone(ngx_log_t *log) +{ + ngx_log_debug(log, "child process"); + ngx_msleep(5000); + exit(0); +} + + +int ngx_spawn_process(ngx_log_t *log) +{ + pid_t pid; + sigset_t set, oset; + + sigemptyset(&set); + sigaddset(&set, SIGCHLD); + if (sigprocmask(SIG_BLOCK, &set, &oset) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "sigprocmask() failed"); + } + + pid = fork(); + + if (pid == -1 || pid == 0) { + if (sigprocmask(SIG_SETMASK, &oset, &set) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, + "sigprocmask() failed"); + } + } + + switch (pid) { + case -1: + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "fork() failed"); + return NGX_ERROR; + + case 0: + testone(log); + break; + + default: + } + +ngx_log_debug(log, "parent process, child: " PID_FMT _ pid); + + /* book keeping */ + + if (sigprocmask(SIG_SETMASK, &oset, &set) == -1) { + ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "sigprocmask() failed"); + } + + return NGX_OK; +} + + +void ngx_sigchld_handler(int signo) +{ + int status, one; + pid_t pid; + ngx_err_t err; + struct timeval tv; + + ngx_gettimeofday(&tv); + + if (ngx_cached_time != tv.tv_sec) { + ngx_cached_time = tv.tv_sec; + ngx_time_update(); + } + + one = 0; + + for ( ;; ) { + pid = waitpid(-1, &status, WNOHANG); + + if (pid == 0) { + return; + } + + if (pid == -1) { + err = ngx_errno; + + if (err == NGX_EINTR) { + continue; + } + + if (err == NGX_ECHILD && one) { + return; + } + + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, errno, + "waitpid() failed"); + return; + } + + one = 1; + + ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, + "process " PID_FMT " exited with code %d", pid, status); + + /* TODO: restart handler */ + +#if 0 + ngx_msleep(2000); +#endif + +#if 0 + ngx_spawn_process(ngx_cycle->log); +#endif + } +} |