nginx之ngx_errno.c文件阅读

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

a4.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 = err<HO_NERR ? ho_errlist[err] : ho_unknown_error;

    buf[n-1] = 0;
    return strncpy(buf, msg, n - 1);
}


a6.
a7.

你可能感兴趣的:(nginx之ngx_errno.c文件阅读)