我有一个名为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
来自哪里?
答案 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函数。