file:ngx_errno.c
1.作者为什么写这个模块?2.这个模块要完成什么功能?3.NGX_SYS_NERR这玩意在哪定义的,这么写有什么好处?4.为什么ngx_strerror_init 里面使用了goto语句?5.如果这个模块有本人写,会写成啥样?6.作者设计函数非常棒的地方?7.不明白的地方有?a1.因为strerror strerror_r 都不是信号安全的 a1.1有没有小例子说明不是信号安全的函数有什么问题?a2.这个函数要完成的功能是:根据errno返回描述字符串 如果由本人设计strerror信号安全版本 参数ho_strerror(int errnum, char *buf, size_t n);a3.unknowna4.ngx_strerror_init 函数出现两句goto语句,如果不使用goto的话 第一次出现goto的地方替换为err = errno ngx_log_stderr(); return NGX_ERROR
第二次出现goto的地方替换为
err = errno ngx_log_stderr(); return NGX_ERROR
两种方式完成功能都使用6行代码,从代码行数goto版的写法没啥优势, 有优势的地方ngx_log_stderr只出现一次,
如果修改了ngx_log_stderr, goto版的写法只要改一个ngx_log_stderr,这样就不会像return 版有时发生,改了第一个忘了改第二个的情况。本人写法如下:#define HO_NERR 256 static char **ho_errlist;static char *ho_unknown_error = "Unknown error";int ho_strerror_init(void) { size_t len; int err; ho_errlist = malloc(HO_NERR * sizeof(char *)); if (ho_errlist == NULL) goto failed; for (err = 0; err < HO_NERR; err++) { ho_errlist[err] = strdup(strerror(err)); if (ho_errlist[err] == NULL) goto failed; } return 0;failed: fprintf(stderr, "alloc memory failed (%d: %s)", err, strerror(err)); return -1;}char *ho_strerror(int err, char *buf, size_t n) { char *msg; msg = erra6.a7.