Цифры в скобках почти наверняка являются номерами системных ошибок, о которых обычно сообщается через errno
, определения для которых можно найти через #include <errno.h>
, хотя в Solaris числа обычно находятся в /usr/include/sys/errno.h
(но могут быть и в других местах, особенно в Linux и Mac OS X). Вы можете написать простую программу, чтобы увидеть 3 ошибки.
#include <stdio.h>
#include <string.h>
int main(void)
{
puts(strerror(2));
puts(strerror(95));
puts(strerror(146));
return 0;
}
Предположение: 2, вероятно, ENOENT, такого файла или каталога нет; 95 может быть ENOTSOCK (не сокет); 146 может быть ENOTSUPP (операция не поддерживается).
Джордж Бейли подтверждает:
В моей системе ответ был в /usr/include/sys/errno.h
:
- 2=ЕНОЕНТ
- 95=ЕНОЦОК
- 146=ЭКОНОМ ОТКАЗАНО
Обратите внимание, что номера ошибок до середины двадцатых, как правило, одинаковы в разных системах, поскольку коды ошибок существовали в 7-й редакции Unix. Более высокие числа расходятся. Например, в Mac OS X 10.9:
- 2 (ENOENT): Нет такого файла или каталога
- 95 (ЭМУЛЬТИХОП): Зарезервировано
- errno: нет сообщения для errno = 146
- ENOTSOCK (38): работа с сокетом без сокета
- ECONNREFUSED (61): в соединении отказано
На SuSE (SLES 10 SP2 — старый, но эти цифры не сильно меняются):
- 2 (ENOENT): Нет такого файла или каталога
- 95 (EOPNOTSUPP): операция не поддерживается на конечной точке транспорта.
- errno: нет сообщения для errno = 146
- ENOTSOCK (88): работа с сокетом без сокета
- ECONNREFUSED (111): в соединении отказано
Эти ответы были получены с помощью программы errno
, которая сообщает номера и названия ошибок. Он должен быть скомпилирован для каждой отдельной системы.
Обратите внимание, что для сообщений есть согласованный компонент, предоставляемый MySQL:
Can't connect to local MySQL server through socket '/dev/null' (95)
примерно так, как если бы строка формата для оператора printf()
была:
"Can't connect to local MySQL server through socket '%s' (%s)\n"
Предоставляется имя файла «сокета» — очень полезно — и (обоснованное предположение) номер системной ошибки, собранный в какой-то момент из errno
. Однако errno
является изменчивым — почти любая библиотечная функция может установить для него ненулевое значение — поэтому вам нужно сохранить конкретное значение (скопировать его), прежде чем делать какие-либо действия по созданию отчетов об ошибках, например, читать файлы сообщений, чтобы получить правильный перевод строки формата.
person
Jonathan Leffler
schedule
06.12.2013
errno
, обнаруживаются через#include <errno.h>
, хотя числа обычно (в Solaris) находятся в/usr/include/sys/errno.h
(но могут быть и в других местах, особенно в Linux и Mac OS X). Вы можете написать программу#include <stdio.h> #include <string.h> int main(void) { puts(strerror(2)); puts(strerror(95)); puts(strerror(146)); return 0; }
, чтобы увидеть 3 ошибки. 2, вероятно, ENOENT, такого файла или каталога нет; 95 может быть ENOTSOCK (не сокет); 146 может быть ENOTSUPP (операция не поддерживается). - person Jonathan Leffler   schedule 06.12.2013