这个错误信息从何而来?

问题描述 投票:0回答:3

我有一个名为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
从哪里来?

c linux gnu
3个回答
5
投票

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

在这种特殊情况下,我打赌这是 errno 中的 Error NO ENTry 的 ENOENT。

来自男人警告(3)

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


0
投票

该消息来自您的

if (..)
比较的第二部分。

代码已在 sockname 上执行了 stat() 系统调用。 然而,stat() 返回了 ENOENT,这意味着“没有这样的文件或目录”

你需要找出

sockname
是如何构造的,看看它是否应该具有 已有效。


0
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.