加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 当从另一个线程发出信号时,如何从阻塞套接字上的“acce

发布时间:2020-12-14 01:11:25 所属栏目:Linux 来源:网络整理
导读:我在 same situation as this guy,但我不太明白答案. 问题: 线程1在一个阻塞的套接字上调用accept. 线程2调用此套接字关闭. 线程1继续阻塞.我希望它从接受回来. 解决方案: what you should do is send a signal to the thread which is blocked in accept.
我在 same situation as this guy,但我不太明白答案.

问题:

>线程1在一个阻塞的套接字上调用accept.
>线程2调用此套接字关闭.
>线程1继续阻塞.我希望它从接受回来.

解决方案:

what you should do is send a signal to the thread which is blocked in
accept. This will give it EINTR and it can cleanly disengage – and
then close the socket. Don’t close it from a thread other than the one
using it.

我不知道该怎么做 – 当线程1收到信号时,accept已经阻塞,并且在信号处理程序完成后将继续阻塞.

>答案对我应该做什么意味着什么?
>如果Thread 1信号处理程序可以做一些会导致accept立即返回的东西,为什么Thread 2在没有信号的情况下也不能这样做?
>在没有信号的情况下还有另一种方法吗?我不想增加图书馆的警告.

解决方法

而不是在 accept()中阻塞,阻止在 select(),poll()或类似的调用之一,允许您等待多个文件描述符上的活动并使用“自管技巧”.传递给select()的所有文件描述符都应该处于非阻塞模式.其中一个文件描述符应该是与accept()一起使用的服务器套接字;如果那个变得可读,那么你应该继续并调用accept()并且它不会阻塞.除此之外,创建一个 pipe(),将其设置为非阻塞,并检查读取端是否可读.而不是在另一个线程中的服务器套接字上调用close(),而是将一个数据字节发送到管道写入端的第一个线程.实际的字节值无关紧要;目的只是唤醒第一个线程.当select()指示管道是可读的时,读取()并忽略管道中的数据,关闭()服务器套接字,并停止等待新连接.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读