我知道之前已经有很多关于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 只有涉及的标准库函数也返回错误返回才有意义.(例如NULL来自getcwd(3)或来自或-1来自read(2)"负值" printf(3).)
但是在标准库函数失败的情况下,errno是发现失败原因的唯一方法.当其他库函数(不是由标准库提供)失败时,它们可能会使用errno或者它们可能提供类似但不同的工具(请参阅eg ERR_print_errors(3ssl)或gai_strerror(3).).您需要查看所用库的文档以获取完整的详细信息.