【问题标题】:Is it possible for network write() to fail but poll() doesn't detect网络 write() 是否有可能失败但 poll() 未检测到
【发布时间】:2017-05-23 00:00:50
【问题描述】:

是否有可能在套接字上的 write() 调用失败但 poll() 没有 检测到任何错误?是否有任何类别的错误会导致写入失败但不被 poll() 系统调用视为错误?

我有一个调度程序线程,它一直在监视套接字并负责 用于检测和处理套接字错误。 我有一个工作线程,当调度程序线程通知时,它会在套接字上进行实际的读取和写入。 工作线程的 write() 调用失败,但调度程序线程的 poll() 系统调用从不报告错误。怎么会这样!

【问题讨论】:

  • 哪个 errno 失败了?

标签: c linux multithreading sockets poll-syscall


【解决方案1】:

如果write() 失败,则返回-1 并设置errno这是您获得错误的唯一指示。如果您需要将该错误发送到其他地方,您需要自己做。

poll() 将单独检测可能导致此错误的某些异常情况,例如关闭的 TCP 连接。这与“检测”失败的write() 不同——poll() 不会也不能检测到这些错误。

【讨论】:

  • write() 会不会仅仅因为 poll() 也会检测到套接字错误而失败?
  • @siri 并非所有错误。示例:如果套接字设置为非阻塞,如果缓冲区已满,写入将返回 EAGAIN。或者,如果套接字是 UDP,则像 EHOSTUNREACH 这样的错误可能会随着网络状态的变化而出现和消失。
  • EINTR(如果您安装了中断信号处理程序)将是另一个可能的错误poll 看不到。
  • @R.. 也是真的!我并不是说这些是唯一可能的错误——只是几个更明显的例子。
猜你喜欢
  • 1970-01-01
  • 2020-07-15
  • 2010-11-04
  • 1970-01-01
  • 2014-12-22
  • 2018-06-21
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多