我知道之前有很多关于C语言中错误处理的问题,但这个问题是关于errno的。
我想问一下,在运行时我们是否应该使用errno/perror功能来优雅地处理错误。我问这个问题是因为MSVC使用它,而Win32 API也大量使用它。我不知道gcc或“linux API”的情况。今天,无论是gcc还是MSVC都表示,在多线程环境下可以安全地使用errno/perror。那么你的看法是什么?
谢谢。
我知道之前有很多关于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)
返回NULL
或从read(2)
返回-1
,或从printf(3)
返回“负值”。)errno
是发现它们失败的唯一方法。当其他库函数(不由标准库提供)失败时,它们可能使用errno
或提供类似但不同的工具(例如ERR_print_errors(3ssl)
或gai_strerror(3)
)。您必须查看您正在使用的库的文档以获取完整的详细信息。errno
才有意义。 - sarnold