【问题标题】:How to differentiate between two different errors with the same error code?如何区分具有相同错误代码的两个不同错误?
【发布时间】:2019-07-20 23:25:04
【问题描述】:

通过阅读 Linux 手册页,我有时会遇到可以为两个不同的错误返回/设置相同错误代码的函数。一些例子是:

还有更多示例(例如send 可以设置EAGAIN 和EAGAIN 和bind 可以设置EADDRINUSE 和EADDRINUSE,但它们似乎取决于您是否使用数据报套接字因此可以根据上下文找出正确的错误)。

这意味着我应该区分这些错误吗?

【问题讨论】:

  • pthread 函数返回这些错误(如手册页所述) - 我不确定我是否理解您要查找的内容。 socket(2) 和 bind(2) 返回 -1 并设置 errno (再次如手册页所述)。
  • @root socket 和 bind 都返回 -1 错误;那是真实的。但是如果出现错误,他们可以将errno 设置为EINVAL,即使发生了两个不同的错误。我的问题是当它们都将errno 设置为相同的值时,我应该如何区分这两个错误。我可以根据某些情况来做吗?我可以在函数的帮助下做到这一点吗?有什么我不知道的秘密吗?

标签: linux sockets pthreads error-code errno


【解决方案1】:

没有通用的方法来区分这些条件。

有时手册页会指定您可以检查的条件,但仅此而已。

您应该设计您正在构建的内容,以便您尝试检测的差异无关紧要。例如,如果您收到EAGAIN,请稍后再试(或返回一些内容给客户端以使其重试)。

【讨论】:

  • 如果是真的,那就太不令人满意了。我遇到的问题与应用程序的设计无关。例如,如果一个线程不能加入,它就不能加入。该应用程序不关心原因并正确处理它,但作为一名程序员,我希望得到关于到底发生了什么问题的反馈。意外创建我尝试加入的可分离线程与让另一个线程等待加入当前线程,需要截然不同的解决方案。
  • 我会等一会儿看看其他人是否有解决方案。感觉就像是一个如此基本的东西,我无法想象它是没有办法区分它们的情况。
  • 我同意你的观点。正如您在此处看到的:github.com/walac/glibc/blob/master/nptl/pthread_join.c,最好的办法是添加检查特定条件的调试代码(在这种情况下,是否线程已分离)。
  • 太多的事情会出错;为每个错误获得一个个性化的错误号是不合理的。例如。 IME EINVAL 几乎总是意味着编程错误。但是,有很多具体的原因。比如说,一个无效的缓冲区地址:通过你的论点,系统不应该准确地告诉你它是如何/为什么无效的吗?也许缓冲区地址在代码空间中;也许它是只读数据,也许是未分配空间,也许它指向内核虚拟地址空间;也许开头是有效的,但它延伸得太远了。 IMO,内核将事情放入类似错误的桶中是一个好处。
  • 我认为他期待特定错误消息之类的东西,就像其他语言中的异常一样。而且我怀疑这样的事情没有实施的原因是因为它可能会鼓励人们例如在引发错误时尝试为错误描述分配内存(在 C 中)。
猜你喜欢
  • 2021-07-29
  • 1970-01-01
  • 2021-02-25
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
相关资源
最近更新 更多