假设我们有一个 TCP 套接字的文件描述符。有没有办法轮询写入套接字的数据(而不是可用于读取的数据或可用于写入的套接字)?即,如果使用 poll
,每当有人写入该文件描述符时,都会导致
poll
被唤醒?换句话说,假设线程 A 等待一段时间,然后决定将数据写入 fd
(也许在它也确保
POLLOUT
为 true 之后)。有没有办法让线程 B 发现某些内容刚刚写入了该文件描述符,而线程 A 除了使用正常的系统调用(并且不以任何特定方式向线程 B 发送信号)以及以“阻塞”方式执行任何操作之外,没有执行任何操作? (例如,可以在繁忙循环中监视 TCP 连接,以查看是否有更多数据已写入内核缓冲区 - 但不是我在这里讨论的内容)。
poll
可用的事件似乎暗示此功能不可能,但想知道是否有其他方法可以做到这一点。这在用户空间中是否可能(无需在内核中进行修改)?
假设 Linux,我没有看到立即令人满意的答案,但可以建议一些潜在的方法:
使用
ioctl()
eventfd
,并且您可以单独阻止它。
使用线程 A 上应用的某种包装器 API 来拦截出站套接字写入。与上面其他人建议的概念相同,但您也可能会考虑异步 I/O 包装器是否可以在这里实现这一点(AIO 完成/错误通知结束在线程 B 上?)。使用 LD_PRELOAD 库拦截线程 A 正在使用的系统调用。在幕后,你劫持的
send
write
版本必须使用
getsockopt()
和 SO_PROTOCOL/SO_DOMAIN 来确保你只影响感兴趣的套接字描述符,然后你必须将适当的通知转发给线程 B其他一些 IPC 机制。
总而言之,听起来您当前的方法可能是最稳健的,在这种情况下我倾向于说IIABDFI