gpt4 book ai didi

c - 今天是否应该使用 errno/perror 方法来检测错误?

转载 作者:太空狗 更新时间:2023-10-29 15:59:41 24 4
gpt4 key购买 nike

我知道之前有很多关于 C 中的错误处理的问题,但这是专门关于 errno 的东西。

我想问一下我们是否应该使用 errno/perror 功能在运行时优雅地处理错误。我问这个是因为 MSVC 使用它并且 Win32 api 也大量使用它。我对 gcc 或 'linux 一无所知api'。今天 gcc 和 MSVC 都说 errno/perror 可以在多线程环境中安全使用。那么你的观点是什么?

谢谢。

最佳答案

请注意,单独使用 errno 是一个坏主意:标准库函数调用其他标准库函数来完成它们的工作。如果其中一个被调用函数失败,errno 将被设置以指示错误原因,并且库函数可能仍会成功,如果它以某种方式编程它可以回退到其他机制。

考虑 malloc(3) —— 它可能被编程为尝试 mmap(.., MAP_PRIVATE|MAP_ANONYMOUS) 作为第一次尝试,如果失败 返回到sbrk(2) 来分配内存。或者考虑 execvp(3) —— 它可能会在尝试执行程序时探测十几个目录,其中许多可能首先失败。 “局部失败”并不意味着更大的失败。 调用的函数在返回给你之前不会将errno设置回0——它可能有一个合法但不相关的遗留值从早些时候开始。

您不能简单地检查 errno 的值来查看您是否遇到了错误。 errno 只有在涉及的标准库函数也返回错误返回值时才有意义。 (例如 getcwd(3) 中的 NULLread(2) 中的 -1,或“负数来自 printf(3) 的值”。)

但是在标准库函数确实失败的情况下,errno 是发现为什么它们失败的唯一方法。当其他库函数(标准库未提供)失败时,它们可能会使用 errno 或者它们可能会提供类似但不同的工具(参见例如 ERR_print_errors(3ssl)gai_strerror(3)。)您必须查看您正在使用的库的文档以获取完整的详细信息。

关于c - 今天是否应该使用 errno/perror 方法来检测错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6464290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com