Nginx 소스 코드 완전 주석 (8) ngxerrno.c
7647 단어 nginx
errno.h
중의 strerror(int errno)
지정 한 errno
의 잘못된 알림 정 보 를 확인 할 수 있 습 니 다.Nginx 에서 모든 오류 알림 정 보 를 한 배열 에 미리 저장 하고 이 배열 의 크기 를 미리 확인 하 는 것 은 자동화 스 크 립 트 에서 이 루어 진 것 입 니 다. 다음 과 같 습 니 다 auto/unix
스 크 립 트: (그 중에서 자동화 스 크 립 트 auto/feature
의 역할 참고 < Nginx · 자동 스 크 립 트 편 해부 (4) 도구 형 스 크 립 트 시리즈 >
// auto/unix
ngx_feature="sys_nerr" ngx_feature_name="NGX_SYS_NERR" ngx_feature_run=value ngx_feature_incs='#include #include ' ngx_feature_path= ngx_feature_libs= ngx_feature_test='printf("%d", sys_nerr);' . auto/feature
그러나 일부 플랫폼 에 대해 서 는
sys_nerr
이 없습니다. 이때 인용 auto/feature
한 후에 얻 은 ngx_found
변수의 값 은 no
이 고 그렇지 않 으 면 yes
입 니 다.no
일 때 다음 단락 을 실행 합 니 다.
// auto/unix
if [ $ngx_found = no ]; then ngx_feature="_sys_nerr" ngx_feature_name="NGX_SYS_NERR" ngx_feature_run=value ngx_feature_incs='#include #include ' ngx_feature_path= ngx_feature_libs= ngx_feature_test='printf("%d", _sys_nerr);' . auto/feature fi
위의 이 단락 은 Cygwin 환경 에서 작용 할 것 이다. 왜냐하면 Cygwin 이 정 의 했 기 때문이다
_sys_nerr
.만약 이후 ngx_found
에 도 no
이 라면 운행:
if [ $ngx_found = no ]; then ngx_feature='maximum errno' ngx_feature_name=NGX_SYS_NERR ngx_feature_run=value ngx_feature_incs='#include #include #include ' ngx_feature_path= ngx_feature_libs= ngx_feature_test='int n; char *p; for (n = 1; n < 1000; n++) { errno = 0; p = strerror(n); if (errno == EINVAL || p == NULL || strncmp(p, "Unknown error", 13) == 0) { break; } } printf("%d", n);' . auto/feature fi
위 부분 은 Solaris 에 발 효 됩 니 다. Solaris 는
sys_nerr
과 _sys_nerr
가 없 기 때 문 입 니 다.이렇게 하면
objs/ngx_auto_config.h
파일 에 다음 과 같은 문장 을 추가 합 니 다.
// Mac OS X 10.8 #ifndef NGX_SYS_NERR #define NGX_SYS_NERR 107 #endif
// Linux ubuntu 3.2.0-30-generic-pae #ifndef NGX_SYS_NERR #define NGX_SYS_NERR 135 #endif
Igor 는 모든 strerror 메 시 지 를 한 배열 에 복사 합 니 다. 그 는 이 유 를 이렇게 설명 합 니 다.
1) strerror() and strerror_r() functions are not Async-Signal-Safe, therefore, they cannot be used in signal handlers;
2) a direct sys_errlist[] array may be used instead of these functions, but Linux linker warns about its usage:
warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead causing false bug reports.
다음 과 같다
src/os/unix/ngx_errno.c
.
static ngx_str_t *ngx_sys_errlist; static ngx_str_t ngx_unknown_error = ngx_string("Unknown error"); // strerror, err 、 errstr // ,errstr u_char * ngx_strerror(ngx_err_t err, u_char *errstr, size_t size) { ngx_str_t *msg; msg = ((ngx_uint_t) err < NGX_SYS_NERR) ? &ngx_sys_errlist[err]: &ngx_unknown_error; size = ngx_min(size, msg->len); return ngx_cpymem(errstr, msg->data, size); } ngx_int_t ngx_strerror_init(void) { char *msg; u_char *p; size_t len; ngx_err_t err; /* * ngx_strerror() is not ready to work at this stage, therefore, * malloc() is used and possible errors are logged using strerror(). */ // strerror ngx_str_t //( , ngx_str_t data ) len = NGX_SYS_NERR * sizeof(ngx_str_t); // , malloc // TODO ngx_sys_errlist = malloc(len); if (ngx_sys_errlist == NULL) { goto failed; } // for (err = 0; err < NGX_SYS_NERR; err++) { // msg = strerror(err); // len = ngx_strlen(msg); // len p = malloc(len); if (p == NULL) { goto failed; } ngx_memcpy(p, msg, len); ngx_sys_errlist[err].len = len; ngx_sys_errlist[err].data = p; } return NGX_OK; failed: err = errno; ngx_log_stderr(0, "malloc(%uz) failed (%d: %s)", len, err, strerror(err)); return NGX_ERROR; }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간단! Certbot을 사용하여 웹 사이트를 SSL(HTTPS)화하는 방법초보자가 인프라 주위를 정돈하는 것은 매우 어렵습니다. 이번은 사이트를 간단하게 SSL화(HTTP에서 HTTPS통신)로 변경하는 방법을 소개합니다! 이번에는 소프트웨어 시스템 Nginx CentOS7 의 환경에서 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.