轮询写入文件描述符的数据

问题描述 投票:0回答:1

假设我们有一个 TCP 套接字的文件描述符。有没有办法轮询写入套接字的数据(而不是可用于读取的数据或可用于写入的套接字)?即,如果使用 poll,每当有人写入该文件描述符时,都会导致

poll
被唤醒?
换句话说,假设线程 A 等待一段时间,然后决定将数据写入 

fd

(也许在它也确保

POLLOUT
为 true 之后)。有没有办法让线程 B 发现某些内容刚刚写入了该文件描述符,而线程 A 除了使用正常的系统调用(并且不以任何特定方式向线程 B 发送信号)以及以“阻塞”方式执行任何操作之外,
没有
执行任何操作? (例如,可以在繁忙循环中监视 TCP 连接,以查看是否有更多数据已写入内核缓冲区 - 但不是我在这里讨论的内容)。 poll可用的事件似乎暗示此功能不可能,但想知道是否有其他方法可以做到这一点。这在用户空间中是否可能(无需在内核中进行修改)?

假设 Linux,我没有看到立即令人满意的答案,但可以建议一些潜在的方法:

c sockets file-descriptor polling
1个回答
0
投票

使用

ioctl()
    持续监视线程 A 使用的 TCP 套接字上的 TIOCOUTQ。不是很优雅(或确定性),并且可能是您希望避免的繁忙循环方法类型。如果您希望“观察者”循环在其他地方唤醒任意轮询实例,它可以轻松写入
  1. eventfd

    ,并且您可以单独阻止它。

    
    
    使用线程 A 上应用的某种包装器 API 来拦截出站套接字写入。与上面其他人建议的概念相同,但您也可能会考虑异步 I/O 包装器是否可以在这里实现这一点(AIO 完成/错误通知结束在线程 B 上?)。

  2. 使用 LD_PRELOAD 库拦截线程 A 正在使用的系统调用。在幕后,你劫持的

    send
  3. write

    版本必须使用

    getsockopt()
    和 SO_PROTOCOL/SO_DOMAIN 来确保你只影响感兴趣的套接字描述符,然后你必须将适当的通知转发给线程 B其他一些 IPC 机制。
    
    
    总而言之,听起来您当前的方法可能是最稳健的,在这种情况下我倾向于说

    IIABDFI

© www.soinside.com 2019 - 2024. All rights reserved.