为什么在程序初始化的时候将errno设置为零,并且在错误发生之前无法测试?

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,只有当函数的返回值表明发生了错误时。我不理解为什么 ?

Cel*_*ada 7

按照惯例,我们errno仅在发生错误时才检查变量(例如某些返回 -1 的函数)。

问题1:那errno在启动程序之前设置为0有什么用。

事实上,我们应该只检查errno发生错误的情况。这是因为如果没有发生错误,那么它仍然可能errno包含非零值(例如,如果在执行库调用期间发生错误但错误已恢复)。

因此,errno在“启动程序”之前设置为 0 是没有必要的,我不会遵循这个建议。

更多,我读到最好将错误号存储到局部变量然后检查它

是的!你关于printf()能够破坏的观察errno是正确的。如果需要保留其值,则应在错误发生后尽快将其复制到局部变量中。

问题二:上面的语句是否适用于 perror() 和 strerror() ,因为它们也是系统调用,并且也有可能发生错误。

perror()可能不会调用任何修改errno,但如果它这样做,那么errno在发生之前复制 的值必须小心。我相信你可以假设它perror()在你的系统上正常工作!

strerror()不需要担心,因为它将错误号作为参数,所以即使errno之前的值已经保存到哪里。

在 Richard Stevens 所著的 UNIX 环境中的高级编程中,我读到我们应该检查 的值errno,只有当函数的返回值表明发生了错误时。我不理解为什么 ?

因为errno在失败时设置的系统调用和库调用不需要将其设置为成功,所以它保留之前的任何值。