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

📄 ngx_cycle.c

📁 Nginx是一个高性能的HTTP和反向代理服务器
💻 C
📖 第 1 页 / 共 3 页
字号:
                          &ls[i].addr_text);        }    }    ngx_destroy_cycle_pools(&conf);    return NULL;}static voidngx_destroy_cycle_pools(ngx_conf_t *conf){    ngx_destroy_pool(conf->temp_pool);    ngx_destroy_pool(conf->pool);}static ngx_int_tngx_cmp_sockaddr(struct sockaddr *sa1, struct sockaddr *sa2){    struct sockaddr_in  *sin1, *sin2;    /* AF_INET only */    if (sa1->sa_family != AF_INET || sa2->sa_family != AF_INET) {        return NGX_DECLINED;    }    sin1 = (struct sockaddr_in *) sa1;    sin2 = (struct sockaddr_in *) sa2;    if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) {        return NGX_DECLINED;    }    if (sin1->sin_port != sin2->sin_port) {        return NGX_DECLINED;    }    return NGX_OK;}#if !(NGX_WIN32)ngx_int_tngx_create_pidfile(ngx_str_t *name, ngx_log_t *log){    size_t            len;    ngx_uint_t        trunc;    ngx_file_t        file;    u_char            pid[NGX_INT64_LEN + 2];    ngx_memzero(&file, sizeof(ngx_file_t));    file.name = *name;    file.log = log;    trunc = ngx_test_config ? 0 : NGX_FILE_TRUNCATE;    file.fd = ngx_open_file(file.name.data, NGX_FILE_RDWR,                            NGX_FILE_CREATE_OR_OPEN|trunc,                            NGX_FILE_DEFAULT_ACCESS);    if (file.fd == NGX_INVALID_FILE) {        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,                      ngx_open_file_n " \"%s\" failed", file.name.data);        return NGX_ERROR;    }    if (!ngx_test_config) {        len = ngx_snprintf(pid, NGX_INT64_LEN + 2, "%P%N", ngx_pid) - pid;        if (ngx_write_file(&file, pid, len, 0) == NGX_ERROR) {            return NGX_ERROR;        }    }    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,                      ngx_close_file_n " \"%s\" failed", file.name.data);    }    return NGX_OK;}voidngx_delete_pidfile(ngx_cycle_t *cycle){    u_char           *name;    ngx_core_conf_t  *ccf;    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);    name = ngx_new_binary ? ccf->oldpid.data : ccf->pid.data;    if (ngx_delete_file(name) == NGX_FILE_ERROR) {        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,                      ngx_delete_file_n " \"%s\" failed", name);    }}#endifstatic ngx_int_tngx_test_lockfile(u_char *file, ngx_log_t *log){#if !(NGX_HAVE_ATOMIC_OPS)    ngx_fd_t  fd;    fd = ngx_open_file(file, NGX_FILE_RDWR, NGX_FILE_CREATE_OR_OPEN,                       NGX_FILE_DEFAULT_ACCESS);    if (fd == NGX_INVALID_FILE) {        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,                      ngx_open_file_n " \"%s\" failed", file);        return NGX_ERROR;    }    if (ngx_close_file(fd) == NGX_FILE_ERROR) {        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,                      ngx_close_file_n " \"%s\" failed", file);    }    if (ngx_delete_file(file) == NGX_FILE_ERROR) {        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,                      ngx_delete_file_n " \"%s\" failed", file);    }#endif    return NGX_OK;}voidngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user){    ngx_fd_t          fd;    ngx_uint_t        i;    ngx_list_part_t  *part;    ngx_open_file_t  *file;    part = &cycle->open_files.part;    file = part->elts;    for (i = 0; /* void */ ; i++) {        if (i >= part->nelts) {            if (part->next == NULL) {                break;            }            part = part->next;            file = part->elts;            i = 0;        }        if (file[i].name.data == NULL) {            continue;        }        if (file[i].buffer && file[i].pos - file[i].buffer != 0) {            ngx_write_fd(file[i].fd, file[i].buffer,                         file[i].pos - file[i].buffer);            file[i].pos = file[i].buffer;        }        fd = ngx_open_file(file[i].name.data, NGX_FILE_RDWR,                           NGX_FILE_CREATE_OR_OPEN|NGX_FILE_APPEND,                           NGX_FILE_DEFAULT_ACCESS);        ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,                       "reopen file \"%s\", old:%d new:%d",                       file[i].name.data, file[i].fd, fd);        if (fd == NGX_INVALID_FILE) {            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                          ngx_open_file_n " \"%s\" failed", file[i].name.data);            continue;        }#if (NGX_WIN32)        if (ngx_file_append_mode(fd) == NGX_ERROR) {            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                          ngx_file_append_mode_n " \"%s\" failed",                          file[i].name.data);            if (ngx_close_file(fd) == NGX_FILE_ERROR) {                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                              ngx_close_file_n " \"%s\" failed",                              file[i].name.data);            }            continue;        }#else        if (user != (ngx_uid_t) NGX_CONF_UNSET_UINT) {            ngx_file_info_t  fi;            if (ngx_file_info((const char *) file[i].name.data, &fi) == -1) {                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                              ngx_file_info_n " \"%s\" failed",                              file[i].name.data);                if (ngx_close_file(fd) == NGX_FILE_ERROR) {                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                                  ngx_close_file_n " \"%s\" failed",                                  file[i].name.data);                }            }            if (fi.st_uid != user) {                if (chown((const char *) file[i].name.data, user, -1) == -1) {                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                                  "chown(\"%s\", %d) failed",                                  file[i].name.data, user);                    if (ngx_close_file(fd) == NGX_FILE_ERROR) {                        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                                      ngx_close_file_n " \"%s\" failed",                                      file[i].name.data);                    }                }            }            if ((fi.st_mode & (S_IRUSR|S_IWUSR)) != (S_IRUSR|S_IWUSR)) {                fi.st_mode |= (S_IRUSR|S_IWUSR);                if (chmod((const char *) file[i].name.data, fi.st_mode) == -1) {                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                                  "chmod() \"%s\" failed", file[i].name.data);                    if (ngx_close_file(fd) == NGX_FILE_ERROR) {                        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                                      ngx_close_file_n " \"%s\" failed",                                      file[i].name.data);                    }                }            }        }        if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                          "fcntl(FD_CLOEXEC) \"%s\" failed",                          file[i].name.data);            if (ngx_close_file(fd) == NGX_FILE_ERROR) {                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                              ngx_close_file_n " \"%s\" failed",                              file[i].name.data);            }            continue;        }#endif        if (ngx_close_file(file[i].fd) == NGX_FILE_ERROR) {            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                          ngx_close_file_n " \"%s\" failed",                          file[i].name.data);        }        file[i].fd = fd;    }#if !(NGX_WIN32)    if (cycle->log->file->fd != STDERR_FILENO) {        if (dup2(cycle->log->file->fd, STDERR_FILENO) == -1) {            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,                          "dup2(STDERR) failed");        }    }#endif}ngx_shm_zone_t *ngx_shared_memory_add(ngx_conf_t *cf, ngx_str_t *name, size_t size, void *tag){    ngx_uint_t        i;    ngx_shm_zone_t   *shm_zone;    ngx_list_part_t  *part;    part = &cf->cycle->shared_memory.part;    shm_zone = part->elts;    for (i = 0; /* void */ ; i++) {        if (i >= part->nelts) {            if (part->next == NULL) {                break;            }            part = part->next;            shm_zone = part->elts;            i = 0;        }        if (name->len != shm_zone[i].name.len) {            continue;        }        if (ngx_strncmp(name->data, shm_zone[i].name.data, name->len) != 0) {            continue;        }        if (size && size != shm_zone[i].shm.size) {            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                               "the size %uz of shared memory zone \"%V\" "                               "conflicts with already declared size %uz",                               size, &shm_zone[i].name, shm_zone[i].shm.size);            return NULL;        }        if (tag != shm_zone[i].tag) {            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                               "the shared memory zone \"%V\" is "                               "already declared for a different use",                               &shm_zone[i].name);            return NULL;        }        return &shm_zone[i];    }    shm_zone = ngx_list_push(&cf->cycle->shared_memory);    if (shm_zone == NULL) {        return NULL;    }    shm_zone->data = NULL;    shm_zone->shm.log = cf->cycle->log;    shm_zone->shm.size = size;    shm_zone->init = NULL;    shm_zone->name = *name;    shm_zone->tag = tag;    return shm_zone;}static voidngx_clean_old_cycles(ngx_event_t *ev){    ngx_uint_t     i, n, found, live;    ngx_log_t     *log;    ngx_cycle_t  **cycle;    log = ngx_cycle->log;    ngx_temp_pool->log = log;    ngx_log_debug0(NGX_LOG_DEBUG_CORE, log, 0, "clean old cycles");    live = 0;    cycle = ngx_old_cycles.elts;    for (i = 0; i < ngx_old_cycles.nelts; i++) {        if (cycle[i] == NULL) {            continue;        }        found = 0;        for (n = 0; n < cycle[i]->connection_n; n++) {            if (cycle[i]->connections[n].fd != (ngx_socket_t) -1) {                found = 1;                ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "live fd:%d", n);                break;            }        }        if (found) {            live = 1;            continue;        }        ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "clean old cycle: %d", i);        ngx_destroy_pool(cycle[i]->pool);        cycle[i] = NULL;    }    ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "old cycles status: %d", live);    if (live) {        ngx_add_timer(ev, 30000);    } else {        ngx_destroy_pool(ngx_temp_pool);        ngx_temp_pool = NULL;        ngx_old_cycles.nelts = 0;    }}

⌨️ 快捷键说明

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