Коды ошибок сокета домена 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? Если да, то есть ли место, где я могу посмотреть значение этого кода?

Как я уже сказал, это конкретный вопрос. Другие полезные материалы следует публиковать по адресу другой вопрос.


person 700 Software    schedule 06.12.2013    source источник
comment
Эти коды ошибок исходят от MySQL.   -  person marekful    schedule 06.12.2013
comment
Цифры в скобках почти наверняка являются номерами системных ошибок, которые обычно сообщаются через 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
comment
@Marcell, судя по ответу Джонатана, ваш комментарий не совсем верен. Коды приходят через MySQL, по-видимому, из Solaris.   -  person 700 Software    schedule 06.12.2013


Ответы (1)


Цифры в скобках почти наверняка являются номерами системных ошибок, о которых обычно сообщается через 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
comment
Спасибо! В моей системе ответ был в /usr/include/sys/errno.h. 2=ENOENT, 95=ENOTSOCK, 146=ECONNREFUSED. - person 700 Software; 06.12.2013
comment
«Вероятно», «может быть» и «может быть» были градуированными шкалами уверенности. У меня больше нет доступа к машине с Solaris, поэтому я не мог проверить. - person Jonathan Leffler; 06.12.2013
comment
Я понимаю, я просто опубликовал свои результаты на случай, если они будут полезны другим. - person 700 Software; 06.12.2013