epoll и отрицательное значение errno

У меня есть функция ERROR_OUT, которая использует vfprintf внутри для регистрации ошибок в консоли. Когда я пытаюсь записать некоторые ошибки epoll с помощью этой функции ERROR_OUT(L_NOTICE, "Epoll error: %d", errno); иногда получаю странный вывод:

Epoll error: -1079274856

Я использую это после epoll_wait а также epoll_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

Решение

Вы передаете va_list в призыве к log_both с помощью *output_handler и заверните это va_list в va_list названный argp,

Таким образом, вы на самом деле передать va_list который содержит va_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));
}
1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector