2012-03-12 22 views
2

例如,如果它未能调用的msgsnd/msgrcv:在Linux API或系统调用失败后,我必须处理所有errno吗?

  1. 如何处理错误号–什么是最好的方法是什么?
  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: 
      ... 
     } 

回答

2

这取决于您要应用的编码标准,以及如何可以合理的故障做出回应。

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

软件越重要,它需要更谨慎地设计,更全面的错误处理就是其中的一部分。由于你的标签是“C”和“Linux”,我假设你使用的是GCC,在这种情况下,可以看看printf中方便的%m。

+0

'%m'与'strerror(errno)'具有'%s'相同,后者更便于携带。 – 2012-03-12 03:39:35

2

很显然,在某些情况下,这太简单了,但直到你的程序完成这样的事情是一个很好的存根都有。

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

通常,如果在这种情况下需要特定的恢复,那么只会查看确切的错误。直到你有一些代码,你需要做的错误的确切类型有条件的,你应该简单地之间做出选择......

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

也见...

+0

退出程序的longjmp(第一条规则)是..,不要谈论longjmp的()! ;) – blueshift 2012-03-12 02:04:51

1

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

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

如果问题有一个最终答案,将不需要0​​- 系统调用可以做到这一点以及。

1

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

#include<string.h> 

char* strerror(int errno); 

告诉错误后,它是在错误的严重程度是否continut运行程序或

exit(1); 
相关问题