我在same situation as this guy中,但是我不太明白答案。
问题:
accept
。 close
。 解决方案:
我不知道该怎么做-在线程1中接收到信号后,
accept
已经被阻塞,并且在信号处理程序完成后将继续阻塞。accept
立即返回,为什么线程2在没有信号的情况下也不能执行相同操作? 最佳答案
而不是阻塞 accept()
,而不是阻塞 select()
, poll()
或类似的调用之一,它允许您等待多个文件描述符上的 Activity 并使用“自管技巧”。传递给select()
的所有文件描述符都应处于非阻塞模式。文件描述符之一应该是与accept()
一起使用的服务器套接字;如果该代码变得可读,则应继续调用accept()
,它将不会阻塞。除此以外,创建一个 pipe()
,将其设置为非阻塞,然后检查读取面是否可读。不必在另一个线程的服务器套接字上调用close()
,而是将数据字节发送到管道写端的第一个线程。实际的字节值无关紧要;目的仅仅是唤醒第一个线程。当select()
指示管道可读时,read()
并忽略管道中的数据,close()
服务器套接字,并停止等待新连接。