apache的启动过程 原代码 分析

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1./server/log.c 这个里面定义了ap_log_error()。

2./include/httpd.h 这个文件里面申明了基本的内容,如文件路径,字符串长度,等等。

3./server/listen.c

对于apache的httpd,有很多的技术,有MPM多任务并发处理(采用记分板),内存池,线程池。。。

1.在main()有一个for(;;)里面调用了ap_mpm_run。但这个循环里好象只执行了一次,而不是一直在循环。

2.在ap_mpm_run()里,有一个while (!restart_pending && !shutdown_pending)。这个循环每一秒就往返一次,一直执行,直到进程结束。如果是第一次启动,在这个循环里,会调用一个startup_children();在这里面又有一个循环调用make_child()产生初始数量的子进程。

3.在上面的while里,perform_idle_server_maintenance(pconf)会每1秒执行一次,如果你kill -9一个子进程,这个函数就起作用,再重新调用make_child()生成一个子进程。

4.如果执行httpd –k stop,那么ap_mpm_run()会返回错误,在main()就会跳出for(;;),进程退出。5.在make_child()里,有一个fork()调用产生子进程,然后在子进程里调用child_main()进行子进程的初始化处理。

linux-lncx:/home/apache/httpd-2.2.11/server # ls main.c

main.c

linux-lncx:/home/apache/httpd-2.2.11/server #

int main(int argc, const char * const argv[])

{

char c;

int configtestonly = 0;

const char *confname = SERVER_CONFIG_FILE;

const char *def_server_root = HTTPD_ROOT;

const char *temp_error_log = NULL;

const char *error;

process_rec *process;

server_rec *server_conf;

apr_pool_t *pglobal;

apr_pool_t *pconf;

apr_pool_t *plog; /* Pool of log streams, reset _after_ each read of conf */

apr_pool_t *ptemp; /* Pool for temporary config stuff, reset often */

apr_pool_t *pcommands; /* Pool for -D, -C and -c switches */

apr_getopt_t *opt;

apr_status_t rv;

module **mod;

const char *optarg;

APR_OPTIONAL_FN_TYPE(ap_signal_server) *signal_server;

AP_MONCONTROL(0); /* turn off profiling of startup */

process = init_process(&argc, &argv);

pglobal = process->pool;

pconf = process->pconf;

ap_server_argv0 = process->short_name;

#if APR_CHARSET_EBCDIC

if (ap_init_ebcdic(pglobal) != APR_SUCCESS) {

destroy_and_exit_process(process, 1);

}

#endif

apr_pool_create(&pcommands, pglobal);

apr_pool_tag(pcommands, "pcommands");

ap_server_pre_read_config = apr_array_make(pcommands, 1, sizeof(char *));

ap_server_post_read_config = apr_array_make(pcommands, 1, sizeof(char *));

ap_server_config_defines = apr_array_make(pcommands, 1, sizeof(char *));

error = ap_setup_prelinked_modules(process);

if (error) {

ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_EMERG, 0, NULL, "%s: %s",

ap_server_argv0, error);

destroy_and_exit_process(process, 1);

}

ap_run_rewrite_args(process);

/* Maintain AP_SERVER_BASEARGS list in http_main.h to allow the MPM * to safely pass on our args from its rewrite_args() handler.

*/

apr_getopt_init(&opt, pcommands, process->argc, process->argv);

while ((rv = apr_getopt(opt, AP_SERVER_BASEARGS, &c, &optarg))

== APR_SUCCESS) {

char **new;

switch (c) {

case 'c':

new = (char **)apr_array_push(ap_server_post_read_config); *new = apr_pstrdup(pcommands, optarg);

break;

case 'C':

new = (char **)apr_array_push(ap_server_pre_read_config); *new = apr_pstrdup(pcommands, optarg);

break;

case 'd':

def_server_root = optarg;

break;

case 'D':

new = (char **)apr_array_push(ap_server_config_defines);

*new = apr_pstrdup(pcommands, optarg);

/* Setting -D DUMP_VHOSTS is equivalent to setting -S */

if (strcmp(optarg, "DUMP_VHOSTS") == 0)

configtestonly = 1;

/* Setting -D DUMP_MODULES is equivalent to setting -M */ if (strcmp(optarg, "DUMP_MODULES") == 0)

configtestonly = 1;

break;

case 'e':

if (strcasecmp(optarg, "emerg") == 0) {

ap_default_loglevel = APLOG_EMERG;

}

else if (strcasecmp(optarg, "alert") == 0) {

ap_default_loglevel = APLOG_ALERT;

}

else if (strcasecmp(optarg, "crit") == 0) {

ap_default_loglevel = APLOG_CRIT;

}

else if (strncasecmp(optarg, "err", 3) == 0) {

ap_default_loglevel = APLOG_ERR;

}

else if (strncasecmp(optarg, "warn", 4) == 0) {

ap_default_loglevel = APLOG_WARNING;

}

else if (strcasecmp(optarg, "notice") == 0) {

ap_default_loglevel = APLOG_NOTICE;

}

else if (strcasecmp(optarg, "info") == 0) {

ap_default_loglevel = APLOG_INFO;

}

else if (strcasecmp(optarg, "debug") == 0) {

ap_default_loglevel = APLOG_DEBUG;

}

else {

usage(process);

}

break;

case 'E':

temp_error_log = apr_pstrdup(process->pool, optarg);

break;

相关文档
最新文档