epoll和负errno值

时间:2014-08-11 14:25:22

标签: c++ unix epoll

我有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);
}

1 个答案:

答案 0 :(得分:1)

您通过va_listlog_both传递给*output_handler并将va_list包裹在名为va_list的{​​{1}}中。

因此,您实际上将包含argp的{​​{1}}传递给va_list作为第三个参数,该参数要求va_list的小数成为vfprintf中的第一个元素1}}。

因此,%d va_listvoid log_both(int level, const char *fmt, va_list argp){}va_list argp;已从功能正文中移除。

va_start(argp, fmt);