Я пишу программу, в которой большинство используемых библиотечных функций возвращают -1 при ошибке и устанавливают errno. Поведение программы таково, что она завершает работу в случае возникновения ошибки. Чтобы определить точную точку выхода и ошибку извне программы (пример с использованием gdb
), я хочу использовать следующий метод:
err = func_1(..arglist_1..);
if(err != 0)
{
perror("func(..arglist..)");
return ((1u << 8) | errno);
}
//..
//.. some more funcs
//..
err = func_n(..arglist_n..);
if(err != 0)
{
perror("func(..arglist_n..)");
return (((unsigned)n << 8) | errno);
}
Проблема здесь в безопасных предположениях.
Реальность: errno объявляется как extern int errno;
внутри errno.h
Предположение 1: значение errno всегда меньше 255.
Предположение 2: ошибка нет всегда положительна.
На основе всех констант ошибок (EAGAIN и т. д.), определенных в errno.h
, эти предположения в настоящее время верны. Можно ли предположить, что они верны и в будущем?
P.S.: Я не хочу зависеть от perror()
для определения точки выхода.
0
положительным? - person jxh   schedule 21.08.20130
не исключено, так как здесь указано:No function in this volume of IEEE Std 1003.1-2001 shall set errno to 0.
- person Don't You Worry Child   schedule 21.08.20130
, не означает, что кто-то другой не устанавливает для него значение0
. Для некоторых стандартных библиотечных функций единственный способ определить, не удалось ли выполнить вызов, — сначала установитьerrno
в0
, а затем посмотреть, что делает функция. - person jxh   schedule 21.08.2013getpriority()
:-). - person Don't You Worry Child   schedule 21.08.2013errno
даже при успешном вызове. - person jxh   schedule 21.08.2013errno
в случае ошибки, но не влияют на успех библиотечной функции. Например, библиотечная функция может проверить наличие одного из двух файлов, если любой из них существует, вызов может продолжиться и завершиться успешно, даже если первый проверяемый файл не существует. - person jxh   schedule 21.08.2013