mun*_*007 5 c error-handling exit-status
我正在阅读errno
有关<errno.h>
头文件变量的可用材料。
我读 :
“ 0 值表示程序中没有错误。” 和“作为一个好习惯,开发人员应该errno
在程序初始化时设置为 0”
按照惯例,我们errno
仅在发生错误时才检查变量(例如某些返回 -1 的函数)。
问题1:那errno
在启动程序之前设置为0有什么用。
更多,我读到最好将错误号存储到局部变量然后检查它,即
if (somecall() == -1) {
printf("somecall() failed\n");
if (errno == ...) { ... }
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码printf()
中errno
,如果 发生某些错误,函数调用可能会覆盖 的值printf()
。
问题2:上面的说法是否适用于perror()
和strerror()
,因为它们也是系统调用,并且它们也有可能发生错误。
在 Richard Stevens 所著的 UNIX 环境中的高级编程中,我读到我们应该检查 的值errno
,只有当函数的返回值表明发生了错误时。我不理解为什么 ?
按照惯例,我们
errno
仅在发生错误时才检查变量(例如某些返回 -1 的函数)。问题1:那
errno
在启动程序之前设置为0有什么用。
事实上,我们应该只检查errno
发生错误的情况。这是因为如果没有发生错误,那么它仍然可能errno
包含非零值(例如,如果在执行库调用期间发生错误但错误已恢复)。
因此,errno
在“启动程序”之前设置为 0 是没有必要的,我不会遵循这个建议。
更多,我读到最好将错误号存储到局部变量然后检查它
是的!你关于printf()
能够破坏的观察errno
是正确的。如果需要保留其值,则应在错误发生后尽快将其复制到局部变量中。
问题二:上面的语句是否适用于 perror() 和 strerror() ,因为它们也是系统调用,并且也有可能发生错误。
perror()
可能不会调用任何修改errno
,但如果它这样做,那么errno
在发生之前复制 的值必须小心。我相信你可以假设它perror()
在你的系统上正常工作!
strerror()
不需要担心,因为它将错误号作为参数,所以即使errno
之前的值已经保存到哪里。
在 Richard Stevens 所著的 UNIX 环境中的高级编程中,我读到我们应该检查 的值
errno
,只有当函数的返回值表明发生了错误时。我不理解为什么 ?
因为errno
在失败时设置的系统调用和库调用不需要将其设置为成功,所以它保留之前的任何值。