Следует ли сегодня использовать методологию errno / perror для обнаружения ошибок? - PullRequest
3 голосов
/ 24 июня 2011

Я знаю, что ранее задавалось много вопросов об обработке ошибок в C, но это конкретно о вещах с ошибками.

Я хочу спросить, следует ли нам использовать функцию errno / perror, чтобы корректно обрабатывать ошибки во время выполнения.Я спрашиваю об этом, потому что MSVC использует его и Win32 api также интенсивно его использует. Я ничего не знаю о gcc или 'linux api'. Сегодня и gcc, и MSVC говорят, что errno / perror можно безопасно использовать в многопоточной среде.что ты думаешь?

спасибо.

Ответы [ 3 ]

7 голосов
/ 24 июня 2011

Обратите внимание, что использование только 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).). Вам придется проверить документацию кбиблиотеки, которые вы используете для полной информации.

1 голос
/ 24 июня 2011

Я не знаю, действительно ли это вопрос «должен», но если вы программируете на C и используете низкоуровневый C / posix API, другого варианта действительно нет.Конечно, вы можете обернуть это, если это оскорбляет ваши стилистические чувства, но под капотом именно так оно и должно работать (по крайней мере, пока POSIX является стандартом).

0 голосов
/ 24 июня 2011

В Linux errno безопасно для чтения / записи в нескольких потоках или процессах, но не с perror ().Это стандартная библиотека, которая не возвращается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...