我可以帮您翻译成中文:在哪里可以看到与errno交互的函数列表?

9
在《C语言程序设计》一书中提到:
许多库函数在发生错误或文件结尾时设置状态指示器,这些指示器可以被显式地设置和测试。此外,整数表达式errno(声明在中)可能包含有关最近错误的进一步信息。
我该在哪里查看这些函数列表?

@Leif,很酷你正在学习K&R。我在假期里也花了几天时间完成了同样的学习。(-: - Rob Wells
6个回答

7
标准对errno的定义如下:

程序启动时,errno的值为零,但任何库函数都不会将其设置为零。只要在此国际标准的函数描述中未记录使用errno,库函数调用可能会将errno设置为非零值,无论是否存在错误。

这意味着除了以下两种情况外,任何库函数都可以随意操作errno
  • 不能将errno设置为0
  • 如果标准明确说明,则不能随意操作
请注意,标准在注释中建议:

因此,使用errno进行错误检查的程序应在调用库函数之前将其设置为零,然后在后续的库函数调用之前检查它。当然,库函数可以在进入时保存errno的值,然后将其设置为零,只要在返回之前如果errno的值仍为零,则恢复原始值。

正如其他答案中所述,非标准函数通常也会设置errno

5
您应该假设任何函数都可以设置errno,不仅仅是标准库中的函数。因此,列出这些函数会有点没用。

我不同意,尽管按照你的方式生活肯定会更容易!我目前正在与一些嵌入式库进行斗争,它们返回像“发生错误:errno = 0”这样的消息。因此,正如OP所暗示的那样,如果您原谅我对您的名字无法抗拒的双关语,过滤掉那些不设置有用值的函数将是有帮助的。 - Adam Liss
1
@Adam 那是什么双关语?我猜我错过了一些明显而粗鲁的东西? - anon
这个问题不是关于任何函数的 - 它是关于标准库中的函数。标准文档记录了修改errno的库函数。毫无意义的是把那些保证不会修改errno的函数当作可能会修改errno来处理。 - Dingo
@Neil:Butterworth滤波器是一种经典的电子电路,作为EE本科生数学考验的一部分进行教学。如果你期望更多的粗鲁行为,那我很抱歉让你失望了。:-)@Dingo:同意这些函数已经有文档记录并(我们希望)遵循标准。我的观点是我从未遇到过一个将errno设置为有用值的规范函数列表。 - Adam Liss
@Adam 是的,我知道Butterworth滤波器 - 我希望有更多(或者确实有)粗鲁的东西 :-( - anon

1
几乎所有的posix库函数在发生错误时(即函数返回-1时)都可以设置errno。但线程函数是个例外,因为从多个线程中设置一个全局错误变量会非常危险。它们在成功时返回0,在出错时返回错误代码(该代码与errno兼容,因此您可以在其上使用strerror和perror函数)。

真的有一个具有线程但没有线程本地errno的POSIX实现吗? - bk1e
1
errno 被指定为线程特定。-1 表示关于此事的错误信息。 - R.. GitHub STOP HELPING ICE
我从未说过errno不是线程特定的。无论如何,线程函数都不会设置errno。 - codymanix
由于多个线程设置一个全局错误变量:根据标准,errno是一个“可修改的左值宏,具有int类型和线程本地存储期”。errno“不需要是对象的标识符”。 - pmor

0
一个适当的问题可能是,errno 可以得到哪些值,每个值代表什么意思。你可以在 intro(2) 中看到它们的列表。

0

@Adam,正如Neil所说,任何函数都可以编译errno.h并设置errno。 根据定义,不可能列出所有已以这种方式编译以使用核心errno功能的实用程序。

话虽如此,有几种方法可将错误报告回用户。 使用errno只是其中之一。


-2

您可以使用您喜欢的编辑器和“在文件中查找...”功能来搜索包含errno关键字的文件。


加粗字体在磁盘上占用更多的空间吗? - Rob Wells
我不明白你的意思。不管怎样,我的意思是搜索库文件(*.c,*.cpp)。 - Nick Dandoulakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接