c++ - 如何确定文件描述符是否已经关闭?

标签 c++ c unix system-calls file-descriptor

投票关闭之前,请阅读,我知道有类似的问题(:

这是我的情况 - 我有一个应用程序,它是多线程的。所以,假设我有 10 个线程。他们都从同一个文件描述符(它实际上是一个 socket )读取。在极少数情况下,当发生严重错误时,套接字应该被其中一个线程关闭。问题是,这些线程中的任何一个都可以做到这一点。如果套接字关闭失败,则执行 _Exit( FAILURE )(我知道,这听起来像是代码中糟糕的设计或问题,但实际上并非如此,因为这是由由一个非开源的第 3 方库,有一个错误)。

这就是问题所在 - 可能所有人都试图同时关闭 套接字。一个关闭它,但其他人无法关闭它(shutdown 返回 -1,因为套接字已经关闭)并且错误的 _Exit( FAILURE ) 被执行并且破坏了一切。

显然,我需要额外检查 - 如果套接字已经关闭(可能所有线程都因某种原因未能关闭套接字,然后至少有一个必须执行 _Exit,那是为什么检查 shutdown 的返回码是不够的)。

好吧,我找到了this问题,看起来这正是我想要做的。 但我知道,任何类型的系统调用都需要时间(当然),并且它取决于操作系统何时关闭套接字。

问题来了——如果套接字已经关闭或由于某种原因无法关闭,我该如何区分? fcntl 是否会确保我,如果一个线程关闭了套接字,同时如果其他线程试图关闭 套接字,它将失败,然后,如果我进行此检查(使用 fcntl ),这对我有用吗?

我还看到了其他答案,例如:“您可以使用 selectpoll”,但它们仍然是系统调用,我不知道它们是否会是更好的选择。我也不知道如何使用它们,但我想这没什么大不了的。

谢谢!


我也可以查看shutdown设置的errno,但是“connected”是什么意思? “已连接”和“不是有效描述符”之间有什么区别

ENOTCONN
    The specified socket is not connected.

此外,令我困扰的是,我试图关闭的 FD 可能是无效的,因为我从 /proc/net/tcp 中获取它并映射到 proc/PID/fd 并且我不知道是否所有文件看起来都像这样,它们在我的操作系统上看起来(操作系统肯定是 RHEL4 或 RHEL5,如果重要的话)

呸!这太他妈长了,但我无法解释得更短。

最佳答案

我假设您是说关闭套接字后您的应用程序有可能合理地继续运行?

似乎更好的方法是让中介线程收到来自任何工作线程的套接字关闭请求的通知,通知其他线程套接字现在已死,并负责关闭套接字本身。这消除了对失败原因的担忧,因为它全部在单个线程中处理。

关于c++ - 如何确定文件描述符是否已经关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5706736/

相关文章:

php - 自动显示 public_html 文件夹

c++ - Berkeley DB:DbEnv::lsn_reset 需要很长时间

c++ - 计算检测到的对象 OPENCV

c# - 例如,是否有可能销毁/删除 self ?

c++ - OpenMP 使用矩阵乘法任务

c - lambda宏如何创建lambda?

linux - 我如何正确引用此 bash 管道以供观看?

c++ 编译错误 "required from ' _InputIterator std::__find_if(_InputIterator, _InputIterator, _Predicate, std::input_iterator_tag) "

c - 在 tcsh shell 下,如何将脚本的输出发送到 shell 和 gdb 上的程序?

linux - Linux中的fork()是否将父进程的所有内存页复制到子进程?