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

📄 proc.c

📁 Apache官方在今天放出产品系列2.2的最新版本2.2.11的源码包 最流行的HTTP服务器软件之一
💻 C
📖 第 1 页 / 共 2 页
字号:
        if ((setrlimit(RLIMIT_CPU, attr->limit_cpu)) != 0) {            return errno;        }    }#endif#ifdef RLIMIT_NPROC    if (attr->limit_nproc != NULL) {        if ((setrlimit(RLIMIT_NPROC, attr->limit_nproc)) != 0) {            return errno;        }    }#endif#if defined(RLIMIT_AS)    if (attr->limit_mem != NULL) {        if ((setrlimit(RLIMIT_AS, attr->limit_mem)) != 0) {            return errno;        }    }#elif defined(RLIMIT_DATA)    if (attr->limit_mem != NULL) {        if ((setrlimit(RLIMIT_DATA, attr->limit_mem)) != 0) {            return errno;        }    }#elif defined(RLIMIT_VMEM)    if (attr->limit_mem != NULL) {        if ((setrlimit(RLIMIT_VMEM, attr->limit_mem)) != 0) {            return errno;        }    }#endif#else    /*     * Maybe make a note in error_log that setrlimit isn't supported??     */#endif    return APR_SUCCESS;}APR_DECLARE(apr_status_t) apr_procattr_child_errfn_set(apr_procattr_t *attr,                                                       apr_child_errfn_t *errfn){    /* won't ever be called on this platform, so don't save the function pointer */    return APR_SUCCESS;}APR_DECLARE(apr_status_t) apr_procattr_error_check_set(apr_procattr_t *attr,                                                       apr_int32_t chk){    /* won't ever be used on this platform, so don't save the flag */    return APR_SUCCESS;}APR_DECLARE(apr_status_t) apr_procattr_addrspace_set(apr_procattr_t *attr,                                                       apr_int32_t addrspace){    attr->addrspace = addrspace;    return APR_SUCCESS;}APR_DECLARE(apr_status_t) apr_proc_create(apr_proc_t *newproc,									const char *progname, 									const char * const *args, 									const char * const *env,                              		apr_procattr_t *attr,                               		apr_pool_t *pool){    wiring_t wire;    int      addr_space;    wire.infd  = attr->child_in                 ? (attr->child_in->filedes != -1 ? attr->child_in->filedes                                                 : FD_UNUSED)               : fileno(stdin);    wire.outfd  = attr->child_out                ? (attr->child_out->filedes != -1 ? attr->child_out->filedes                                                   : FD_UNUSED)                : fileno(stdout);    wire.errfd  = attr->child_err                ? (attr->child_err->filedes != -1 ? attr->child_err->filedes                                                   : FD_UNUSED)                : fileno(stderr);    newproc->in = attr->parent_in;    newproc->out = attr->parent_out;    newproc->err = attr->parent_err;    /* attr->detached and PROC_DETACHED do not mean the same thing.  attr->detached means     * start the NLM in a separate address space.  PROC_DETACHED means don't wait for the     * NLM to unload by calling wait() or waitpid(), just clean up */    addr_space = PROC_LOAD_SILENT | (attr->addrspace ? 0 : PROC_CURRENT_SPACE);    addr_space |= (attr->detached ? PROC_DETACHED : 0);    if (attr->currdir) {        char *fullpath = NULL;        apr_status_t rv;        if ((rv = apr_filepath_merge(&fullpath, attr->currdir, progname,                                      APR_FILEPATH_NATIVE, pool)) != APR_SUCCESS) {            return rv;        }        progname = fullpath;    }     if ((newproc->pid = procve(progname, addr_space, (const char**)env, &wire,         NULL, NULL, 0, NULL, (const char **)args)) == -1) {        return errno;    }    if (attr->child_in && (attr->child_in->filedes != -1)) {        apr_pool_cleanup_kill(apr_file_pool_get(attr->child_in),                               attr->child_in, apr_unix_file_cleanup);        apr_file_close(attr->child_in);    }    if (attr->child_out && (attr->child_out->filedes != -1)) {        apr_pool_cleanup_kill(apr_file_pool_get(attr->child_out),                               attr->child_out, apr_unix_file_cleanup);        apr_file_close(attr->child_out);    }    if (attr->child_err && (attr->child_err->filedes != -1)) {        apr_pool_cleanup_kill(apr_file_pool_get(attr->child_err),                               attr->child_err, apr_unix_file_cleanup);        apr_file_close(attr->child_err);    }    apr_pool_cleanup_register(pool, (void *)newproc, apr_netware_proc_cleanup,        apr_pool_cleanup_null);    return APR_SUCCESS;}APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc,                                                  int *exitcode,                                                  apr_exit_why_e *exitwhy,                                                  apr_wait_how_e waithow,                                                  apr_pool_t *p){    proc->pid = -1;    return apr_proc_wait(proc, exitcode, exitwhy, waithow);}APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc,                                        int *exitcode, apr_exit_why_e *exitwhy,                                        apr_wait_how_e waithow){    pid_t pstatus;    int waitpid_options = WUNTRACED;    int exit_int;    int ignore;    apr_exit_why_e ignorewhy;    if (exitcode == NULL) {        exitcode = &ignore;    }    if (exitwhy == NULL) {        exitwhy = &ignorewhy;    }    if (waithow != APR_WAIT) {        waitpid_options |= WNOHANG;    }    /* If the pid is 0 then the process was started detached. There        is no need to wait since there is nothing to wait for on a        detached process.  Starting a process as non-detached and       then calling wait or waitpid could cause the thread to hang.       The reason for this is because NetWare does not have a way        to kill or even signal a process to be killed.  Starting        all processes as detached avoids the possibility of a        thread hanging. */    if (proc->pid == 0) {        *exitwhy = APR_PROC_EXIT;        *exitcode = 0;        return APR_CHILD_DONE;    }    if ((pstatus = waitpid(proc->pid, &exit_int, waitpid_options)) > 0) {        proc->pid = pstatus;        if (WIFEXITED(exit_int)) {            *exitwhy = APR_PROC_EXIT;            *exitcode = WEXITSTATUS(exit_int);        }        else if (WIFSIGNALED(exit_int)) {            *exitwhy = APR_PROC_SIGNAL;            *exitcode = WIFTERMSIG(exit_int);        }        else {            /* unexpected condition */            return APR_EGENERAL;        }        return APR_CHILD_DONE;    }    else if (pstatus == 0) {        return APR_CHILD_NOTDONE;    }    return errno;}APR_DECLARE(apr_status_t) apr_procattr_limit_set(apr_procattr_t *attr, apr_int32_t what,                           struct rlimit *limit){    switch(what) {        case APR_LIMIT_CPU:#ifdef RLIMIT_CPU            attr->limit_cpu = limit;            break;#else            return APR_ENOTIMPL;#endif        case APR_LIMIT_MEM:#if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM) || defined(RLIMIT_AS)            attr->limit_mem = limit;            break;#else            return APR_ENOTIMPL;#endif        case APR_LIMIT_NPROC:#ifdef RLIMIT_NPROC            attr->limit_nproc = limit;            break;#else            return APR_ENOTIMPL;#endif    }    return APR_SUCCESS;}  APR_DECLARE(apr_status_t) apr_procattr_user_set(apr_procattr_t *attr,                                                 const char *username,                                                const char *password){    /* Always return SUCCESS because NetWare threads don't run as a user */    return APR_SUCCESS;}APR_DECLARE(apr_status_t) apr_procattr_group_set(apr_procattr_t *attr,                                                 const char *groupname){    /* Always return SUCCESS because NetWare threads don't run within a group */    return APR_SUCCESS;}

⌨️ 快捷键说明

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