При звонке execl(...)
я получаю errno=2
. Что это означает? Как я могу узнать значение этого errno
?
221
Вы можете использовать, strerror()
чтобы получить удобочитаемую строку для номера ошибки. Это та же строка, что и при печати, perror()
но она полезна, если вы форматируете сообщение об ошибке для чего-то отличного от стандартного вывода ошибки.
Например:
#include <errno.h>
#include <string.h>
/* ... */
if(read(fd, buf, 1)==-1) {
printf("Oh dear, something went wrong with read()! %s\n", strerror(errno));
}
Linux также поддерживает явно поточно-безопасный вариант strerror_r()
.
strerror()
не является потокобезопасным, аstrerror_r()
потокобезопасным. Функции MT-Safe или Thread-Safe можно вызывать при наличии других потоков. MT в MT-Safe означает Multi Thread. -p26, Библиотека GNU Cchar * strerror(int errnum )
[Функция] Предварительно: | MT-небезопасная гонка: strerror | AS-небезопасная куча i18n | AC-небезопасный мем | См. Раздел 1.2.2.1 [Концепции безопасности POSIX], стр. 2. -p58, Библиотека GNU Cerrno
поточно-ориентирован Посмотрите:#define errno *__errno_location()
errno
, GNU libcstrerror
пишет во внутренний глобальный буфер . Это не всегда так, но в некоторых случаях это так. Вы будете перезаписывать этот буфер, пока другой поток его читает.errno
, нетstrerror()
.Вместо того, чтобы работать
perror
с любым кодом ошибки, который вы получаете, вы можете получить полный списокerrno
значений в вашей системе со следующей однострочной строкой:cpp -dM /usr/include/errno.h | grep 'define E' | sort -n -k 3
источник
В Linux также есть очень удобный инструмент, который может сразу сказать, что означает каждый код ошибки. На Ubuntu:
apt-get install errno
.Затем, если, например, вы хотите получить описание типа ошибки 2, просто введите
errno 2
в терминале.С
errno -l
вами вы получите список со всеми ошибками и их описаниями. Гораздо проще, чем другие методы, упомянутые в предыдущих постерах.источник
perror
/strerror
лучше, потому что тогда ПОЛЬЗОВАТЕЛЮ не нужно искать его. Хотяerrno -l
лучше их найти.Вот вывод от
errno -l
переформатированного для удобства чтения:Я использовал табулирование в Vim для выравнивания столбцов:
источник
Код ошибки 2 означает «Файл / каталог не найден». В общем, вы можете использовать функцию perror для печати удобочитаемой строки.
источник
Есть несколько полезных функций для работы с
errno
с. (Просто чтобы прояснить, они встроены вlibc
- я просто предоставляю примеры реализаций, потому что некоторые люди считают чтение кода более понятным, чем чтение английского.)strerror
возвращает строку, описывающую номер ошибки, который вы ей передали. Внимание, это не потокобезопасно и не защищено от прерываний; он может переписать строку и вернуть тот же указатель при следующем вызове. Используйте,strerror_r
если вам нужно беспокоиться об этом.perror
выводит сообщение, которое вы ему даете, плюс строку, описывающую текущуюerrno
, со стандартной ошибкой.источник
some people find reading code clearer than reading English
правда.Это быстрее, чем искать код
errno.h
, короче, чем большинство решений, опубликованных здесь, и не требует установки сторонних инструментов:perl -E 'say $!=shift' 2
доходность
No such file or directory
источник
-E
обрабатывает следующий код в кавычках как скрипт Perl.say
записывает свои аргументы в стандартный вывод.$!
это специальная переменная, содержащая значениеerrno
. Если используется в строковом контексте, он выдает соответствующую строку ошибки. Сценарий присваивает значение2
этой переменной с помощьюshift
команды, которая отсекает заголовок массива аргументов@ARGV
и размещает его на своем месте. Командная строка также могла быть написана какperl -E 'say $!=2'
.Работает на солярисе.
cc perror.c -o perror
<< используйте эту строку для компиляцииисточник
perror(NULL);
? Сperror("");
его форматом есть: ERROR NAME
. Сperror(NULL);
его выходом простоERROR NAME
Вот документация . Это должно сказать вам, что это значит и что с ними делать. Вам следует избегать использования числовых значений и использовать перечисленные там константы, так как число может меняться в разных системах.
источник
errnoname
библиотека . Он заботится об утомительной части сбора всех возможных имен errno в функцию C, которая может быть просто использована для получения имени макроса errno из числа. Используя это как основу, создание вашегоperror
варианта должно быть быстрым и простым.Я использую следующий скрипт:
источник
Введите,
sudo apt-get install moreutils
а затем после установки введитеerrno 2
. Вы можете также использоватьerrno -l
для всех номеров ошибок, или увидеть только файл из них по конвейеру егоgrep
, как это:errno | grep file
.источник
Вызов
в случае ошибки.
Образец:
Руководства
errno(3)
иperror(3)
тоже интересны ...источник
Когда вы используете strace (в Linux) для запуска вашего бинарного файла, он выведет результаты системных вызовов и то, что означает номер ошибки. Иногда это может быть полезно для вас.
источник
У меня есть следующие функции в моем файле .bashrc - он ищет значение Errno из заголовочных файлов (может быть
/usr/include/errno.h
,/usr/include/linux/errno.h
и т.д., и т.д.)Работает, если на машине установлены заголовочные файлы ;-)
Обычно в заголовочном файле есть ошибка + далее идет пояснение в комментарии; кое-что из следующего:
./asm-generic/errno-base.h:#define EAGAIN 11 / * Попробуйте еще раз * /
источник
Это значит:
источник