nginx 소스 코드 (4) 메 인 프로 세 스
nginx 는 단일 프로 세 스 로 console 에서 실 행 됩 니 다. core / nginx. c 의 main 방법 을 읽 습 니 다. 앞 에는 모두 초기 화 된 코드 입 니 다. 자세히 보지 않 으 면 섬세 한 반지 에 빠 지기 쉽 습 니 다.직접 ngx 찾기single_process_cycle 의 정의, os / unix / ngxprocess_cycle. c 중.
첫 번 째 for 순환 에 다음 코드 를 추가 합 니 다:
for (i = 0; ngx_modules[i]; i++) {
char * p = NULL;
if (ngx_modules[i]->commands != NULL)
{
p = ngx_modules[i]->commands->name.data;
}
if (ngx_modules[i]->init_process) {
if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) {
/* fatal */
exit(2);
}
printf("[ngx_process_cycle] module ctx_index=%d index=%d name=%s init process
", ngx_modules[i]->ctx_index, ngx_modules[i]->index, p);
}
else
{
printf("[ngx_process_cycle] module ctx_index=%d index=%d name=%s
", ngx_modules[i]->ctx_index, ngx_modules[i]->index, p);
}
}
printf("[ngx_process_cycle] for ngx_modules init done
");
현재 nginx 에 어떤 모듈 과 관련 된 색인, 이름 을 인쇄 하 는 역할 을 합 니 다.
두 번 째 for 순환 에서 주로 ngxprocess_이벤트 방법 을 찾 아 보 니 이것 은 매크로 이 고 이 매크로 는 또 하나의 전역 변수 입 니 다. 우리 가 불 러 온 epoll 모듈 이기 때문에 이벤트 / modules / ngxepoll_module. c 에서 코드 찾기:
ngx_event_actions = ngx_epoll_module_ctx.actions;
ngx 발견process_이벤트 방법 은 사실 ngxepoll_module_ctx 모듈 의 actions 중의 ngxepoll_process_이벤트 방법.이 방법 에서 epoll 찾기wait 방법 이 호출 된 곳 에 다음 코드 를 추가 합 니 다.
printf("[ngx_epoll_module] epoll wait
");
events = epoll_wait(ep, event_list, nevents, timer);
printf("[ngx_epoll_module] epoll wait ---
");
실행 결과 다시 만 들 기:
[main] to start ngx_single_process_cycle [ngx_process_cycle] module ctx_index=0 index=0 name=daemon [ngx_process_cycle] module ctx_index=0 index=1 name=error_log [ngx_process_cycle] module ctx_index=0 index=2 name=include [ngx_process_cycle] module ctx_index=0 index=3 name=events [ngx_process_cycle] module ctx_index=0 index=4 name=connections init process [ngx_process_cycle] module ctx_index=1 index=5 name=rtsig_signo [ngx_process_cycle] module ctx_index=2 index=6 name=epoll_events [ngx_process_cycle] module ctx_index=0 index=7 name=http [ngx_process_cycle] module ctx_index=0 index=8 name=server [ngx_process_cycle] module ctx_index=1 index=9 name=log_format [ngx_process_cycle] module ctx_index=2 index=10 name=(null) [ngx_process_cycle] module ctx_index=3 index=11 name=index [ngx_process_cycle] module ctx_index=4 index=12 name=allow [ngx_process_cycle] module ctx_index=5 index=13 name=rewrite [ngx_process_cycle] module ctx_index=6 index=14 name=proxy_pass [ngx_process_cycle] module ctx_index=7 index=15 name=(null) [ngx_process_cycle] module ctx_index=8 index=16 name=(null) [ngx_process_cycle] module ctx_index=9 index=17 name=(null) [ngx_process_cycle] module ctx_index=10 index=18 name=(null) [ngx_process_cycle] module ctx_index=11 index=19 name=gzip [ngx_process_cycle] module ctx_index=12 index=20 name=charset_map [ngx_process_cycle] module ctx_index=13 index=21 name=userid [ngx_process_cycle] module ctx_index=14 index=22 name=expires [ngx_process_cycle] module ctx_index=15 index=23 name=output_buffers [ngx_process_cycle] module ctx_index=16 index=24 name=(null) [ngx_process_cycle] module ctx_index=17 index=25 name=(null) [ngx_process_cycle] for ngx_modules init done [ngx_epoll_module] epoll wait ^C[ngx_epoll_module] epoll wait —
총 25 개의 모듈 이 발견 되 었 습 니 다. connections 모듈 만 init 가 있 습 니 다.process 방법, 그리고 일부 모듈 name 이 비어 있 습 니 다.마지막 프로그램 이 epoll 모듈 에 들 어가 서 epoll 에 막 혔 습 니 다.wait 호출 처, CTRL + C 가 출시 된 후에 야 뒤의 인쇄 문 구 를 실 행 했 습 니 다.
여기 서 nginx 가 모듈 에 대한 정 의 를 자세히 볼 수 있 습 니 다. 코드 를 볼 때 nginx 에서 실제 사용 하 는 유형 이 인 것 을 쉽게 발견 할 수 있 습 니 다.t 엔 딩, 이 유형 이 정 의 될 때 구조 체 라면 실제 유형 은s 엔 딩, nginxmodule_s 의 정 의 는 코어 / ngxconf_file. h 파일 중:
struct ngx_module_s {
ngx_uint_t ctx_index;
ngx_uint_t index;
void *ctx;
ngx_command_t *commands;
ngx_uint_t type;
ngx_int_t (*init_module)(ngx_cycle_t *cycle);
ngx_int_t (*init_process)(ngx_cycle_t *cycle);
#if 0
ngx_int_t (*init_thread)(ngx_cycle_t *cycle);
#endif
};
그 중 에는 두 개의 색인 번호 가 있 고 명령 과 세 개의 함수 가 있 으 며 구체 적 으로 어떤 의 미 를 가지 고 있 는 지 나중에 다시 보 자.
그리고 또 다른 두 개의 구조 체 ngxevent_module_t 와 ngxevent_actions_t; 후 자 는 전자의 구성원 이다.전 자 는 nginx 이벤트 모듈 이지 만 추상 적 으로 특정한 플랫폼 에 서로 다른 유형 이 있 을 수 있 습 니 다. 여 기 는 epoll 입 니 다.ngx_event_module_t 는 다음 과 같다.
typedef struct {
ngx_str_t *name;
void *(*create_conf)(ngx_cycle_t *cycle);
char *(*init_conf)(ngx_cycle_t *cycle, void *conf);
ngx_event_actions_t actions;
} ngx_event_module_t;
epoll 인 스 턴 스 는 다음 과 같 습 니 다.
ngx_event_module_t ngx_epoll_module_ctx = {
&epoll_name,
ngx_epoll_create_conf, /* create configuration */
ngx_epoll_init_conf, /* init configuration */
{
ngx_epoll_add_event, /* add an event */
ngx_epoll_del_event, /* delete an event */
ngx_epoll_add_event, /* enable an event */
ngx_epoll_del_event, /* disable an event */
ngx_epoll_add_connection, /* add an connection */
ngx_epoll_del_connection, /* delete an connection */
NULL, /* process the changes */
ngx_epoll_process_events, /* process the events */
ngx_epoll_init, /* init the events */
ngx_epoll_done, /* done the events */
}
};
마침 ngxevent_module_t 중의 actions 멤버 는 ngxepoll_module_ctx 에 서 는 epoll 과 관련 된 함수 로 정의 되 며, 앞의 ngxprocess_이벤트 는 아래 두 줄 코드 로 연결 되 어 있 습 니 다: 이벤트 / ngx이벤트
#define ngx_process_events ngx_event_actions.process_events
event/modules/ngx_epoll_module. c 중
ngx_event_actions = ngx_epoll_module_ctx.actions;
ngx_event_actions 는 전역 변수 로 이벤트 / ngx 에 정의 합 니 다.이벤트. c 중:
ngx_event_actions_t ngx_event_actions;
다음은 epoll 이 nginx 에서 사용 하 는 것 을 보 겠 습 니 다.
to be continued …
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA- 소스 코드 분할(Package 사용)▪️test45.java 소스 코드 ▪️test47.java 소스 코드 ▪️실행 결과 더하면 12, 당기면 8 ▪️예① 클래스 이름에 대한 완전한 입력 생략 import 문 사용 ▪️예① test45.java 소스 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.