此错误消息来自哪里?

时间:2014-02-13 13:01:07

标签: c linux gnu

我有一个名为trickle的程序会发出警告,其源代码中有:

if (stat(sockname, &sb) == -1 &&
    (errno == EACCES || errno == ENOENT))
    warn("Could not reach trickled, working independently");

但我得到的信息是:

trickle: Could not reach trickled, working independently: No such file or directory

No such file or directory来自哪里?

3 个答案:

答案 0 :(得分:4)

我认为当你得到一个存储在errno中的错误值时,函数warn可以将它用作精度。

在这个特殊情况下,我打赌它是错误的ENOENT NO EN尝试在errno中。

来自man warn(3)

  

err(),verr(),warn()和vwarn()函数根据全局变量errno追加从strerror(3)获得的错误消息,前面是另一个冒号和空格,除非fmt参数为NULL 。

答案 1 :(得分:0)

该消息来自if (..)比较的第二部分。

代码在sockname上执行了stat()系统调用。 但是,stat()返回ENOENT,转换为“No such file or directory”

您需要了解sockname是如何构建的,以确定它是否应该具有 一直有效。

答案 2 :(得分:0)

错误来自stat函数,并作为warn函数的一部分报告。更详细地说,来自警告文件:

  

Fn err和Fn警告函数族显示格式化错误   标准错误输出上的消息。在所有情况下,最后一个   程序名称的组成部分,冒号字符和空格   输出。如果Fa fmt参数不为NULL,则类似printf(3)   输出格式化的错误消息。输出由a终止   换行符。

     

Fn err,Fn verr,Fn警告,Fn vwarn函数附加一个   基于代码或全局从strerror(3)获得的错误消息   变量errno前面是另一个冒号和空格,除非Fa fmt   参数为NULL输入代码

所以“没有这样的文件或目录”来自stat操作,因为它无法找到sockname并且正通过代码传递给warn函数。