Коды ошибок сокета домена 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 (операция не поддерживается).

George Bailey подтверждает:

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

Другие вопросы по тегам