Обратите внимание, что использование только errno
является плохой идеей : стандартные библиотечные функции вызывают другие стандартные библиотечные функции для своей работы.В случае сбоя одной из вызванных функций будет установлено errno
, указывающее причину ошибки, а библиотечная функция может все еще выполнить , если она была запрограммирована таким образом, что она может вернуться кдругие механизмы.
Рассмотрим malloc(3)
- его можно запрограммировать на попытку mmap(.., MAP_PRIVATE|MAP_ANONYMOUS)
в качестве первой попытки, а в случае неудачи вернуться к sbrk(2)
для выделения памяти.Или рассмотрите execvp(3)
- он может проверять дюжину каталогов при попытке выполнить программу, и многие из них могут сначала потерпеть неудачу.«Локальная ошибка» не означает большую ошибку.И функция , которую вы вызвали, не установит errno
обратно на 0
перед возвратом к вам - у нее может быть допустимое, но не относящееся к делу значение, оставшееся от более раннего.
Вы не можетепросто проверьте значение errno
, чтобы увидеть, если вы столкнулись с ошибкой.errno
только имеет смысл, если задействованная стандартная библиотечная функция также вернула ошибку, возвращающую .(Например, NULL
из getcwd(3)
или -1
из read(2)
или «отрицательное значение» из printf(3)
.)
Но в случаях, когда стандартные функции библиотеки не работают, errno
это единственный способ узнать , почему они потерпели неудачу.Когда другие библиотечные функции (не поставляемые стандартными библиотеками) дают сбой, они могут использовать errno
или могут предоставлять аналогичные, но разные инструменты (см., Например, ERR_print_errors(3ssl)
или gai_strerror(3)
.). Вам придется проверить документацию кбиблиотеки, которые вы используете для полной информации.