在Linux API或系统调用失败后,我必须处理所有errno吗?

例如,如果它未能调用msgsnd / msgrcv:

  1. 如何处理errno – 最好的方法是什么?
  2. 什么原则适用于商业产品?
  3. 我必须涵盖所有这些吗?
  4. 什么样的错误必须处理? 我必须为EINTR写一个信号处理程序吗?

这是我的稻草人代码:

RetVal = msgrcv(... ); if( RetVal == -1 ) { switch (errno) { case E2BIG: ... case EAGAIN: ... case EFAULT: ... case EIDRM: ... case EINTR: ... case EINVAL: ... case ENOMEM: ... default: ... } 

这取决于您想要应用的编码标准,以及如何合理地对失败做出响应。

应该经常检查错误,但通常只能处理其中的一个或两个,例如EINTR。 至少在出现意外错误的情况下,我会至少尝试打印某种诊断最后一条消息,然后再猛烈退出。

软件越关键,越需要谨慎设计,更全面的错误处理就是其中的一部分。

既然你的标签是“C”和“Linux”,我假设你正在使用GCC,在这种情况下,看看printf中方便的%m。

显然这对于​​某些情况来说太简单了,但是直到你的程序完成之后,这样的东西才是一个很好的存根。

 if(RetVal == -1) { perror("message receive"); exit(1); } 

通常情况下,如果在这种情况下需要特定的恢复,则只会查看确切的错误。 直到你有一些代码,你需要作出条件的错误类型,你应该简单地决定…

  1. 默默地忽略错误
  2. 警告,然后继续
  3. 抱怨,然后退出

也可以看看…

  • 非标准但有用的错误(3)。
  • setjmp,longjmp,sigsetjmp等

这取决于你的代码,你可以做什么(类似于例外)以及你收到了什么错误。 例如, EAGAIN不是一个严格的错误(它表示你尝试了非阻塞操作,它会阻塞)。

如果这是一个快速的程序,你可能什么都不做(说 – 你只是玩API)。 如果它有GUI,它可能会显示一条消息(说“磁盘已满”或“无法连接到网络”)等

如果这个问题有一个最终的答案,那么就不需要errno – 系统调用也可以做到这一点。

基本的Linux系统调用几乎都是错误的返回-1,成功时为0或正值。 此外,errno被设置为预定义的值之一。 所以,检查系统调用失败是相当容易的,应该一致地完成。 检查errno发生的错误类型应该是你的程序本身可以处理的错误。 对于其他错误,最好通知用户他犯了一个错误,并通知他错误。 string.h中的strerror()将erroro作为参数,并返回一个指向描述错误的字符串的指针。

  #include<string.h> char* strerror(int errno); 

告诉错误之后,是否继续运行程序或退出程序是错误的严重程度

  exit(1);