【问题标题】:Unix Domain Socket Error Codes?Unix 域套接字错误代码?
【发布时间】:2013-12-06 15:11:34
【问题描述】:

我偶尔会在我们一直在运行的 Solaris 10 设置上遇到reviewing an unsolved mystery,我注意到错误消息中的某些内容可能会提供帮助我解开谜团的线索。

错误消息是在 UNIX 域套接字上连接到 MySQL 时。

我这里有一个具体的问题,关于the error code at the end

看到这三个错误信息:

  • 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 域套接字错误代码吗?如果是这样,有什么地方可以查到那个代码的含义吗?

正如我所说,这是一个具体的问题。其他有用的意见应发布到the other question

【问题讨论】:

  • 这些错误代码来自 MySQL。
  • 括号中的数字几乎肯定是系统错误编号,通常通过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(不是socket); 146 可能是 ENOTSUPP(不支持操作)。
  • @Marcell,根据乔纳森的回答,您的评论并不完全正确。代码来自 MySQL,貌似来自 Solaris。

标签: mysql solaris unix-socket


【解决方案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(不是socket); 146 可能是 ENOTSUPP(不支持操作)。

George Baileyconfirms:

在我的系统上,答案在/usr/include/sys/errno.h

  • 2=ENOENT
  • 95=ENOTSOCK
  • 146=ECONNREFUSED

请注意,由于错误代码存在于第 7 版 Unix 中,因此直到 20 年代中期的错误编号在整个系统中往往是一致的。更高的数字分歧。例如,在 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"

正在提供“套接字”文件的名称 — 非常有用 — 以及(有根据的猜测)系统错误号,这些错误号是在某个时间点从 errno 收集的。然而,errno 是易变的——几乎任何库函数都可以将其设置为非零值——因此在进行大量错误报告工作之前,您需要保留一个特定值(复制它),例如读取消息文件获取格式字符串的正确翻译。

【讨论】:

  • 谢谢!在我的系统上,答案在/usr/include/sys/errno.h。 2=ENOENT, 95=ENOTSOCK, 146=ECONNREFUSED.
  • “可能”、“可能”和“可能”是信心的分级量表。我无法再访问 Solaris 机器,所以无法检查。
  • 我明白了,我只是发布我的结果以防它对其他人有用。
猜你喜欢
  • 1970-01-01
  • 2010-11-02
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2017-06-10
  • 2016-08-28
相关资源
最近更新 更多