Коды ошибок сокета домена Unix?
Я иногда просматривал нерешенную загадку на установке Solaris 10, которую мы выполняли, и я заметил кое-что в сообщении об ошибке, которое может дать подсказку, чтобы помочь мне разгадать эту загадку.
Сообщение об ошибке при подключении к MySQL на доменном сокете UNIX.
У меня есть конкретный вопрос, который касается кода ошибки в конце.
Смотрите эти три сообщения об ошибках:
mysql -S /tmp/missing.sock
выходыCan't connect to local MySQL server through socket '/tmp/missing.sock' (2)
mysql -S /dev/null
выходыCan't connect to local MySQL server through socket '/dev/null' (95)
Редкая и периодическая ошибка, которую я пытаюсь устранить,
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (146)
Это число в конце: это код ошибки доменного сокета UNIX? Если так, есть ли место, где я могу посмотреть значение этого кода?
Как я уже сказал, это конкретный вопрос. Другой полезный вклад должен быть размещен на другой вопрос.
1 ответ
Числа в скобках почти наверняка являются номерами системных ошибок, обычно сообщаемыми через errno
определения для которых найдены через #include <errno.h>
хотя на солярисе цифры обычно в /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 = ENOENT
- 95 = ENOTSOCK
- 146 = ECONNREFUSED
Обратите внимание, что число ошибок до середины двадцатых годов, как правило, одинаково во всех системах, поскольку коды ошибок существовали в 7-м издании Unix. Большие цифры расходятся. Например, в Mac OS X 10.9:
- 2 (ENOENT): нет такого файла или каталога
- 95 (EMULTIHOP): зарезервировано
- 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"
Предоставляется имя файла 'socket' - очень полезно - и (догадка с обоснованием) номер системной ошибки, собранный в какой-то момент из errno
, Тем не мение, errno
является изменчивым - почти любая библиотечная функция может установить его в ненулевое значение - поэтому вам нужно сохранить определенное значение (скопировать его), прежде чем делать что-либо в работе с отчетами об ошибках, например читать файлы сообщений, чтобы получить правильный перевод форматной строки.