nginx原始碼學習 錯誤處理

2021-07-02 09:50:22 字數 1916 閱讀 5171

2015-05-09 wcdj

nginx在的main入口函式中(src/core/nginx.c),首先會呼叫ngx_strerror_init函式完成對錯誤碼和錯誤資訊的初始化,為什麼這麼做呢?繼續看下內部實現。

此函式定義在src/os/unix/ngx_errno.c中:

static ngx_str_t  *ngx_sys_errlist;

static ngx_str_t   ngx_unknown_error = ngx_string("unknown error");

ngx_uint_t

ngx_strerror_init(void)

for (err = 0; err < ngx_sys_nerr; err++)

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;

}

可以看到此函式會動態建立乙個包含ngx_sys_nerr(此大小是在自動化指令碼auto/unix生成的)個ngx_str_t元素的陣列ngx_sys_errlist,用於記錄錯誤碼[0,ngx_sys_nerr-1]對應的每乙個錯誤資訊描述。為什麼這麼做,其實在src/os/unix/ngx_errno.c中,作者已經有注釋說明:

/*

* the strerror() messages are copied because:

* * 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.

*/

作者解釋為什麼要把strerror()對應的錯誤資訊描述複製乙份,即ngx_sys_errlist。原因如下:

1)strerror()和strerror_r()函式都不是async-signal-safe,因此,它們不能用在訊號的處理函式中;

2)但是使用ngx_sys_errlist陣列代替strerror()和strerror_r()函式,linux上的鏈結器會產生告警;

使用ngx_sys_errlist陣列實際是呼叫src/os/unix/ngx_errno.c中的ngx_strerror函式:

u_char *

ngx_strerror(ngx_err_t err, u_char *errstr, size_t size)

即,ngx_strerror函式會根據錯誤碼入參,將ngx_sys_errlist陣列中的對應的錯誤資訊拷貝給呼叫者提供的buffer中,供呼叫者使用。

Android學習錯誤處理

解決方法 你嘗試新增下面兩個屬性看看 android hinttext為空時顯示的文字提示資訊,可通過textcolorhint設定提示資訊的顏色 android inputtype設定文字的型別,用於幫助輸入法顯示合適的鍵盤型別。android hinttext 這裡提示你該輸入什麼內容 andr...

Swift學習 錯誤處理

錯誤處理 error handling 是響應錯誤以及從錯誤中恢復的過程。swift 提供了在執行時對可恢復錯誤的丟擲 捕獲 傳遞和操作的一等公民支援。某些操作無法保證總是執行完所有 或總是生成有用的結果。可選型別可用來表示值缺失嗎,但是當某個操作失敗時,最好能得知失敗的原因,從而可以作出相應的應對...

nginx原始碼學習

nginx原始碼學習是乙個痛苦又快樂的過程,下面列出了一些nginx的學習資源。看了nginx原始碼,發現這是乙份完全沒有注釋,完全沒有配置文件的 這份注釋版原始碼會不斷進行更新的 好了,第乙個問題,nginx的main函式在 呢?src core nginx.c 第二個問題,nginx啟動的時候都...