aboutsummaryrefslogtreecommitdiff
path: root/src/os/unix/ngx_process.c
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2003-11-19 16:26:41 +0000
committerIgor Sysoev <igor@sysoev.ru>2003-11-19 16:26:41 +0000
commit160d774afcf3cdd4f999489211eb9d78bf82439a (patch)
tree59227d2698d9c531808a9f3edb708f36707a37f9 /src/os/unix/ngx_process.c
parent1b138ed141c0bdb0c9944c1ae70e53682ed2d035 (diff)
downloadnginx-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.c112
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
+ }
+}