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; } 

좋은 웹페이지 즐겨찾기