Nginx 소스 코드 | Nginx 신호 처리
최근 에 Nginx 소스 코드 를 보고 있 는데, ngx 를 보고 있 습 니 다.master_process_cycle () 함수, 이 함수 에서 신호 처 리 를 사 용 했 습 니 다.다음은 발췌:
...
sigset_t set;
...
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigaddset(&set, SIGALRM);
sigaddset(&set, SIGIO);
sigaddset(&set, SIGINT);
sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));
sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));
if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"sigprocmask() failed");
}
sigemptyset(&set);
...
for( ;;){
...
sigsuspend(&set);
...
}
...
이 코드 는 나 로 하여 금 몇 가지 문 제 를 가지 게 한다.
몇 가지 문제 의 해답
각 함수 의 작용 은 무엇 입 니까?
이 문 제 는 제 글 에 있 습 니 다. Nginx 소스 코드 | ngxmaster_process_cycle () 함수 중의 '보충' 부분 에 설명 이 있 습 니 다.
어떻게 신 호 를 받 습 니까?어디서 이 루어 집 니까?
처음에 나 도 신 호 를 받 는 코드 를 찾 고 있 었 다.프로 세 스 가 sigsuspend (& set) 함수 에 걸 렸 을 때 set 가 새로운 신 호 를 받 은 상태 에서 깨 어 날 수 있 기 때 문 입 니 다. 하지만 언제 set 에 새로운 신호 가 있 을 수 있 습 니까?그리고 나 서 나 는 ngx 에 들 어 갔다.process. c 파일, ngx 찾 았 습 니 다.int_t ngx_init_signals(ngx_log_t *log):
ngx_int_t
ngx_init_signals(ngx_log_t *log)
{
ngx_signal_t *sig;
struct sigaction sa;
for (sig = signals; sig->signo != 0; sig++) {
ngx_memzero(&sa, sizeof(struct sigaction));
if (sig->handler) {
sa.sa_sigaction = sig->handler;
sa.sa_flags = SA_SIGINFO;
} else {
sa.sa_handler = SIG_IGN;
}
sigemptyset(&sa.sa_mask);
if (sigaction(sig->signo, &sa, NULL) == -1) {
#if (NGX_VALGRIND)
ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
"sigaction(%s) failed, ignored", sig->signame);
#else
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
"sigaction(%s) failed", sig->signame);
return NGX_ERROR;
#endif
}
}
return NGX_OK;
}
이 함 수 는 sigaction () 함 수 를 사 용 했 습 니 다.
int sigaction(int sig, const struct sigaction *act, struct sigaction *oact)
그리고 struct sigaction 구조 체.
stuct sigaction
{
void (*)(int) sa_handle;
sigset_t sa_mask;
int sa_flags;
}
기능:
왜 sigaddset 에 이 어 sigemptiset 까지?
siguspend (& set) 함 수 는 set 에 새로운 신호 가 있어 야 깨 어 납 니 다. 그래서 처음에 sigaddset 함수 로 모든 신 호 를 set 에 추가 한 다음 sigprocmask 로 마스크 설정 을 하고 set 의 신호 마스크 를 현재 신호 마스크 에 추가 합 니 다. 신호 마스크 를 설정 하면 set 는 비 워 집 니 다. 그리고 siguspend 함 수 를 호출 합 니 다. 비 워 지지 않 으 면...신 호 를 받 아 도 프로 세 스 를 깨 우지 않 습 니 다. set 에 있 는 모든 신호 가 있 기 때문에 받 은 모든 신 호 는 새로운 신호 가 아니 기 때문에 프로 세 스 를 깨 우지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.