epoll and negative errno value

epoll and negative errno value

本文关键字:value errno negative and epoll      更新时间:2023-10-16

我有ERROR_OUT函数,它在控制台中使用vfprintf来记录错误。当我试图用这个函数ERROR_OUT(L_NOTICE, "Epoll error: %d", errno);记录一些epoll错误时,我有时会得到奇怪的输出:

Epoll error: -1079274856

我仅在epoll_waitepoll_ctl之后使用它,并且仅在返回值为负的情况下调用它。

ERROR_OUT:

void ERROR_OUT(int level, char *template, ...){           
    va_list ap;
    va_start(ap, template);
    if ( level <= verbosity ){
                if (output_handler == NULL){
                        vfprintf(stderr, template, ap);
                }else{
                        (*output_handler)(level, template, ap);
                }
    }
    va_end(ap);
}   
输出处理程序代码:
void log_both(int level, const char *fmt, ...){
    va_list argp;
    va_start(argp, fmt);   
    vfprintf(stderr, fmt, argp);
    printf("n");
    if (globalArgs.db_verbosity >= level)
        globalArgs.db_log->log_error(format(fmt, argp));
    va_end(argp);
}

通过*output_handlerva_list传递给log_both,并将va_list包装在名为argpva_list中。

因此,您实际上将包含va_listva_list传递给vfprintf作为第三个参数,该参数期望%d的小数是va_list的第一个元素。

因此,它应该是void log_both(int level, const char *fmt, va_list argp){}, va_list argp;, va_start(argp, fmt);va_end(argp);从函数体中删除。

void log_both(int level, const char *fmt, va_list argp){
    vfprintf(stderr, fmt, argp);
    printf("n");
    if (globalArgs.db_verbosity >= level)
        globalArgs.db_log->log_error(format(fmt, argp));
}