Unix域套接字错误代码?

时间:2013-12-06 15:11:34

标签: mysql solaris unix-socket

我在运行的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

1 个答案:

答案 0 :(得分: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(不支持操作)。

George Bailey confirms

  

在我的系统上,答案在/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):拒绝连接

On 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是易失性的 - 几乎任何库函数都可以将其设置为非零值 - 因此您需要在执行错误报告工作之前保留特定值(复制它),例如读取消息文件,以获得格式字符串的正确翻译。