繁体   English   中英

从另一个线程关闭套接字时,阻止recv不会退出?

[英]Blocking recv doesn't exit when closing socket from another thread?

在Linux中,如果我们从一个线程调用阻塞recv并从另一个线程关闭同一个套接字,则recv不会退出。

为什么?

“为什么”只是它的设计方式。

在内核中, recv()调用在与struct file对应的struct file上调用了fget() ,这将阻止它在相应的fput()之前被释放。

你只需要改变你的设计(无论如何你的设计都是天生的 - 为了实现这一点,你必须没有锁定保护用户空间中的文件描述符,这意味着close()可能发生 recv()调用之前 - 文件描述符甚至被重用于其他东西)。


如果你想唤醒另一个在文件描述符上阻塞的线程,你应该让它在select()上阻塞,而是在主线程可以写入的文件描述符集中包含一个管道。

检查套接字的所有文件描述符是否已关闭。 如果在“远程端”仍然打开(假设这是您尝试关闭的那个),则“ 对等体未执行有序关闭 ”。

如果仍然无效,请在远程端调用shutdown(sock, SHUT_RDWR) ,无论引用计数如何,都将关闭套接字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM