⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngx_process_cycle.c

📁 nginx 反向代理0.7.1版本 用于实现反向代理
💻 C
📖 第 1 页 / 共 3 页
字号:
    ch.fd = -1;    for (i = 0; i < ngx_last_process; i++) {        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                       "child: %d %P e:%d t:%d d:%d r:%d j:%d",                       i,                       ngx_processes[i].pid,                       ngx_processes[i].exiting,                       ngx_processes[i].exited,                       ngx_processes[i].detached,                       ngx_processes[i].respawn,                       ngx_processes[i].just_respawn);        if (ngx_processes[i].detached || ngx_processes[i].pid == -1) {            continue;        }        if (ngx_processes[i].just_respawn) {            ngx_processes[i].just_respawn = 0;            continue;        }        if (ngx_processes[i].exiting            && signo == ngx_signal_value(NGX_SHUTDOWN_SIGNAL))        {            continue;        }        if (ch.command) {            if (ngx_write_channel(ngx_processes[i].channel[0],                                  &ch, sizeof(ngx_channel_t), cycle->log)                == NGX_OK)            {                if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) {                    ngx_processes[i].exiting = 1;                }                continue;            }        }        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,                       "kill (%P, %d)" , ngx_processes[i].pid, signo);        if (kill(ngx_processes[i].pid, signo) == -1) {            err = ngx_errno;            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,                          "kill(%P, %d) failed",                          ngx_processes[i].pid, signo);            if (err == NGX_ESRCH) {                ngx_processes[i].exited = 1;                ngx_processes[i].exiting = 0;                ngx_reap = 1;            }            continue;        }        if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) {            ngx_processes[i].exiting = 1;        }    }}static ngx_uint_tngx_reap_children(ngx_cycle_t *cycle){    ngx_int_t         i, n;    ngx_uint_t        live;    ngx_channel_t     ch;    ngx_core_conf_t  *ccf;    ch.command = NGX_CMD_CLOSE_CHANNEL;    ch.fd = -1;    live = 0;    for (i = 0; i < ngx_last_process; i++) {        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                       "child: %d %P e:%d t:%d d:%d r:%d j:%d",                       i,                       ngx_processes[i].pid,                       ngx_processes[i].exiting,                       ngx_processes[i].exited,                       ngx_processes[i].detached,                       ngx_processes[i].respawn,                       ngx_processes[i].just_respawn);        if (ngx_processes[i].pid == -1) {            continue;        }        if (ngx_processes[i].exited) {            if (!ngx_processes[i].detached) {                ngx_close_channel(ngx_processes[i].channel, cycle->log);                ngx_processes[i].channel[0] = -1;                ngx_processes[i].channel[1] = -1;                ch.pid = ngx_processes[i].pid;                ch.slot = i;                for (n = 0; n < ngx_last_process; n++) {                    if (ngx_processes[n].exited                        || ngx_processes[n].pid == -1                        || ngx_processes[n].channel[0] == -1)                    {                        continue;                    }                    ngx_log_debug3(NGX_LOG_DEBUG_CORE, cycle->log, 0,                                   "pass close channel s:%i pid:%P to:%P",                                   ch.slot, ch.pid, ngx_processes[n].pid);                    /* TODO: NGX_AGAIN */                    ngx_write_channel(ngx_processes[n].channel[0],                                      &ch, sizeof(ngx_channel_t), cycle->log);                }            }            if (ngx_processes[i].respawn                && !ngx_processes[i].exiting                && !ngx_terminate                && !ngx_quit)            {                if (ngx_spawn_process(cycle, ngx_processes[i].proc,                                      ngx_processes[i].data,                                      ngx_processes[i].name, i)                    == NGX_INVALID_PID)                {                    ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,                                  "can not respawn %s", ngx_processes[i].name);                    continue;                }                ch.command = NGX_CMD_OPEN_CHANNEL;                ch.pid = ngx_processes[ngx_process_slot].pid;                ch.slot = ngx_process_slot;                ch.fd = ngx_processes[ngx_process_slot].channel[0];                for (n = 0; n < ngx_last_process; n++) {                    if (n == ngx_process_slot                        || ngx_processes[n].pid == -1                        || ngx_processes[n].channel[0] == -1)                    {                        continue;                    }                    ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0,                          "pass channel s:%d pid:%P fd:%d to s:%i pid:%P fd:%d",                          ch.slot, ch.pid, ch.fd,                          n, ngx_processes[n].pid,                          ngx_processes[n].channel[0]);                    /* TODO: NGX_AGAIN */                    ngx_write_channel(ngx_processes[n].channel[0],                                      &ch, sizeof(ngx_channel_t), cycle->log);                }                live = 1;                continue;            }            if (ngx_processes[i].pid == ngx_new_binary) {                ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,                                                       ngx_core_module);                if (ngx_rename_file((char *) ccf->oldpid.data,                                    (char *) ccf->pid.data)                    != NGX_OK)                {                    ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                                  ngx_rename_file_n " %s back to %s failed "                                  "after the new binary process \"%s\" exited",                                  ccf->oldpid.data, ccf->pid.data, ngx_argv[0]);                }                ngx_new_binary = 0;                if (ngx_noaccepting) {                    ngx_restart = 1;                    ngx_noaccepting = 0;                }            }            if (i == ngx_last_process - 1) {                ngx_last_process--;            } else {                ngx_processes[i].pid = -1;            }        } else if (ngx_processes[i].exiting || !ngx_processes[i].detached) {            live = 1;        }    }    return live;}static voidngx_master_process_exit(ngx_cycle_t *cycle){    ngx_uint_t  i;    ngx_delete_pidfile(cycle);    ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exit");    for (i = 0; ngx_modules[i]; i++) {        if (ngx_modules[i]->exit_master) {            ngx_modules[i]->exit_master(cycle);        }    }    /*     * Copy ngx_cycle->log related data to the special static exit cycle,     * log, and log file structures enough to allow a signal handler to log.     * The handler may be called when standard ngx_cycle->log allocated from     * ngx_cycle->pool is already destroyed.     */    ngx_exit_log_file.fd = ngx_cycle->log->file->fd;    ngx_exit_log = *ngx_cycle->log;    ngx_exit_log.file = &ngx_exit_log_file;    ngx_exit_cycle.log = &ngx_exit_log;    ngx_cycle = &ngx_exit_cycle;    ngx_destroy_pool(cycle->pool);    exit(0);}static voidngx_worker_process_cycle(ngx_cycle_t *cycle, void *data){    ngx_uint_t         i;    ngx_connection_t  *c;    ngx_worker_process_init(cycle, 1);    ngx_setproctitle("worker process");#if (NGX_THREADS)    {    ngx_int_t         n;    ngx_err_t         err;    ngx_core_conf_t  *ccf;    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);    if (ngx_threads_n) {        if (ngx_init_threads(ngx_threads_n, ccf->thread_stack_size, cycle)            == NGX_ERROR)        {            /* fatal */            exit(2);        }        err = ngx_thread_key_create(&ngx_core_tls_key);        if (err != 0) {            ngx_log_error(NGX_LOG_ALERT, cycle->log, err,                          ngx_thread_key_create_n " failed");            /* fatal */            exit(2);        }        for (n = 0; n < ngx_threads_n; n++) {            ngx_threads[n].cv = ngx_cond_init(cycle->log);            if (ngx_threads[n].cv == NULL) {                /* fatal */                exit(2);            }            if (ngx_create_thread((ngx_tid_t *) &ngx_threads[n].tid,                                  ngx_worker_thread_cycle,                                  (void *) &ngx_threads[n], cycle->log)                != 0)            {                /* fatal */                exit(2);            }        }    }    }#endif    for ( ;; ) {        if (ngx_exiting) {            c = cycle->connections;            for (i = 0; i < cycle->connection_n; i++) {                /* THREAD: lock */                if (c[i].fd != -1 && c[i].idle) {                    c[i].close = 1;                    c[i].read->handler(c[i].read);                }            }            if (ngx_event_timer_rbtree.root == ngx_event_timer_rbtree.sentinel)            {                ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");                ngx_worker_process_exit(cycle);            }        }        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");        ngx_process_events_and_timers(cycle);        if (ngx_terminate) {            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "exiting");            ngx_worker_process_exit(cycle);        }        if (ngx_quit) {            ngx_quit = 0;            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,                          "gracefully shutting down");            ngx_setproctitle("worker process is shutting down");            if (!ngx_exiting) {                ngx_close_listening_sockets(cycle);                ngx_exiting = 1;            }        }        if (ngx_reopen) {            ngx_reopen = 0;            ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "reopening logs");            ngx_reopen_files(cycle, -1);        }    }}static voidngx_worker_process_init(ngx_cycle_t *cycle, ngx_uint_t priority){    sigset_t          set;    ngx_int_t         n;    ngx_uint_t        i;    struct rlimit     rlmt;    ngx_core_conf_t  *ccf;    ngx_listening_t  *ls;    ngx_process = NGX_PROCESS_WORKER;    if (ngx_set_environment(cycle, NULL) == NULL) {        /* fatal */        exit(2);    }    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);    if (priority && ccf->priority != 0) {        if (setpriority(PRIO_PROCESS, 0, ccf->priority) == -1) {            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                          "setpriority(%d) failed", ccf->priority);        }    }    if (ccf->rlimit_nofile != NGX_CONF_UNSET) {        rlmt.rlim_cur = (rlim_t) ccf->rlimit_nofile;        rlmt.rlim_max = (rlim_t) ccf->rlimit_nofile;        if (setrlimit(RLIMIT_NOFILE, &rlmt) == -1) {            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                          "setrlimit(RLIMIT_NOFILE, %i) failed",                          ccf->rlimit_nofile);        }    }    if (ccf->rlimit_core != NGX_CONF_UNSET_SIZE) {        rlmt.rlim_cur = (rlim_t) ccf->rlimit_core;        rlmt.rlim_max = (rlim_t) ccf->rlimit_core;        if (setrlimit(RLIMIT_CORE, &rlmt) == -1) {            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                          "setrlimit(RLIMIT_CORE, %i) failed",                          ccf->rlimit_core);        }    }#ifdef RLIMIT_SIGPENDING    if (ccf->rlimit_sigpending != NGX_CONF_UNSET) {        rlmt.rlim_cur = (rlim_t) ccf->rlimit_sigpending;        rlmt.rlim_max = (rlim_t) ccf->rlimit_sigpending;        if (setrlimit(RLIMIT_SIGPENDING, &rlmt) == -1) {            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                          "setrlimit(RLIMIT_SIGPENDING, %i) failed",                          ccf->rlimit_sigpending);        }    }#endif    if (geteuid() == 0) {        if (setgid(ccf->group) == -1) {            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                          "setgid(%d) failed", ccf->group);            /* fatal */            exit(2);        }        if (initgroups(ccf->username, ccf->group) == -1) {            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                          "initgroups(%s, %d) failed",                          ccf->username, ccf->group);        }        if (setuid(ccf->user) == -1) {            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -