【发布时间】:2011-04-18 17:45:13
【问题描述】:
投票结束前,请阅读,我知道有类似的问题(:
这是我的情况 - 我有一个应用程序,它是多线程的。所以,假设我有 10 个线程。它们都从同一个文件描述符中读取(它实际上是一个套接字)。并且在极少数情况下,当发生严重错误时,其中一个线程应该是shutdown。问题是,这些线程中的任何一个都可以做到这一点。如果套接字关闭失败,则执行 _Exit( FAILURE )(我知道,这听起来像是代码中的糟糕设计或问题,但实际上并非如此,因为这是由非开源 3rd 方库引起的,这有一个错误)。
这就是问题所在——他们都可能同时尝试shutdown 套接字。一个人关闭它,但其他人无法关闭它(shutdown 返回 -1,因为套接字已经关闭)并且错误的 _Exit( FAILURE ) 被执行,这会破坏一切。
显然,我需要进行额外检查 - 套接字是否已关闭(可能所有线程由于某种原因未能关闭套接字,然后至少有一个必须执行 _Exit,这就是检查返回码的原因shutdown 的数量还不够)。
嗯,我找到了this 问题,看起来这正是我想要做的。 但我知道,任何类型的系统调用都需要时间(当然),并且它取决于操作系统何时关闭套接字。
这是一个问题 - 如果套接字已经关闭或由于某种原因无法关闭,我该如何改变? fcntl 是否会向我保证,如果一个线程已关闭套接字,同时如果另一个线程尝试 shutdown 套接字,它将失败,然后,如果我进行此检查(使用 fcntl ),这对我有用吗?
我还看到了其他答案,例如:“您可以使用select 或poll”,但它们仍然是系统调用,我不知道它们是否会是更好的选择。我也不知道具体如何使用它们,但我想这没什么大不了的。
谢谢!
我也可以查看shutdown设置的errno,但是“已连接”是什么意思呢? “已连接”和“不是有效描述符”有什么区别
ENOTCONN
The specified socket is not connected.
另外,困扰我的是,我试图关闭的 FD 可能无效,因为我从映射到 proc/PID/fd 的 /proc/net/tcp 中获取它,我不知道是否所有文件看起来像顺便说一句,他们看我的操作系统(操作系统肯定是 RHEL4 或 RHEL5,如果重要的话)
哇!这该死的长,但我无法解释得更短。
【问题讨论】:
标签: c++ c unix system-calls file-descriptor