gpt4 book ai didi

c - 使用 select 检测服务器套接字关闭

转载 作者:太空宇宙 更新时间:2023-11-04 10:13:32 24 4
gpt4 key购买 nike

我有一个简单的套接字服务器,我在 Linux 和 Windows 上用 C 语言实现了它,但很难完全关闭它。

它创建一个套接字,绑定(bind)它然后调用监听。然后它循环使用 select 来检测新连接,并检测任何当前连接的客户端套接字上的读取事件。关闭套接字的客户端很好,它会唤醒选择,我遇到的问题是干净地关闭循环。我天真地关闭了来自不同线程的服务器套接字(我正在监听和接受的那个),或者为了响应信号或 Ctrl-C,但这未能唤醒选择,这让我感到惊讶。

如有必要,我可以使用自管道技巧来等待选择(创建一个 fifo 并将读取端也包含在选择列表中,然后在我想关闭时写入它),但那不会鉴于代码的结构,非常方便。我只是想知道这是否是预期的行为,我是否希望我的选择在我关闭服务器套接字时被唤醒。它在 Windows 上确实以这种方式工作。

谢谢。

最佳答案

从另一个线程关闭套接字/文件描述符是一个糟糕的主意,因为它容易出现竞争条件。

select 调用被信号中断。您可以使用自管道技巧在您的 select 线程中检测到 SIGINT 并在必要时关闭套接字。

或者,信号处理程序可以设置一个全局 sigatomic_t 变量,而不是通过管道传递信号编号,pselect 线程将检查该变量以及何时 pselect 被信号中断。在这种情况下,SIGINT 必须始终被阻止,除非在 pselect 调用中。

关于c - 使用 select 检测服务器套接字关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47508928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com