Linux套接字终止监听线程

时间:2011-09-11 05:48:28

标签: c linux multithreading sockets

我有一个主要用于侦听套接字的线程。我目前在accept()上有线程阻塞。

如何告诉线程完成任何当前事务并停止侦听,而不是在接受时保持阻止?

如果我不需要......我真的不想做非阻塞。

4 个答案:

答案 0 :(得分:0)

使用select(2)来查看哪个fd已准备好阅读。

来自调用的文件描述符可以在没有阻塞的情况下读取。例如,返回的fd上的accept()将立即创建一个新连接。

答案 1 :(得分:0)

基本上你有两种选择,第一种是使用中断:即 http://www.cs.cf.ac.uk/Dave/C/node32.html(参见信号处理程序部分,它还提供了一个th_kill示例)。

从接受手册页:

accept() shall fail if:
EINTR
    The system call was interrupted by a signal that was caught before a valid connection arrived. 

另一个选择是使用非阻塞套接字和select():即: http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzab6%2Frzab6xnonblock.htm

无论如何,通常在多线程服务器中,有一个线程接受新连接并为每个连接产生其他线程。由于accept()ing和recv()ing,可以延迟新的连接请求...(除非你正在使用一个客户端,然后接受()和接收可能没问题)

答案 2 :(得分:0)

在线程上使用pthread_cancel。您需要确保已安装适当的取消处理程序(pthread_cleanup_push)以避免资源泄漏,并且除了accept调用的持续时间之外,您应该禁用取消以避免取消的竞争条件稍后可能会使用与accept不同的函数执行请求。

请注意,由于glibc实现取消的错误,这种方法可能会导致连接丢失和文件描述符泄漏。这是因为glibc / NPTL不能保证accept没有完成执行,并且在取消请求被执行之前为新连接分配新的文件描述符。它应该是一个相当罕见的事件,但它仍然是一个需要考虑的问题......

请参阅:http://sourceware.org/bugzilla/show_bug.cgi?id=12683

并讨论该问题:Implementing cancellable syscalls in userspace

答案 3 :(得分:0)

来自Wake up thread blocked on accept() call

我刚刚使用了shutdown()系统调用,它似乎工作......