我有C语言编写的一个多线程服务器,每个客户端线程看起来像这样:如何干净地中断阻塞recv呼叫的线程?
ssize_t n;
struct request request;
// Main loop: receive requests from the client and send responses.
while(running && (n = recv(sockfd, &request, sizeof(request), 0)) == sizeof(request)) {
// Process request and send response.
}
if(n == -1)
perror("Error receiving request from client");
else if(n != sizeof(act))
fprintf(stderr, "Error receiving request from client: Incomplete data\n");
// Clean-up code.
在某些时候,客户满足一定的标准,它必须被断开。如果客户经常发送请求,这是没有问题的,因为它可以被告知响应中的断开;但是有时客户端需要很长时间才能发送请求,所以客户端线程最终会阻塞recv
调用,并且客户端在下一个请求/响应之前不会断开连接。
有一个干净的方式,而在客户端线程在recv
呼叫阻塞从另一个线程断开客户端?我尝试了close(sockfd)
,但这会导致发生错误Error receiving request from client: Bad file descriptor
,这确实不准确。
另外,有我在这里处理错误更好的办法?
可能的重复http://stackoverflow.com/questions/6910335/interrupting-syscalls-in-threads-on-linux –
@DrewMcGowen谢谢,我看了类似的线程,但我设法错过了那一个。尽管如此,仍然不确定这是一个完全相同的问题,因为彻底杀死这个线程并不是我真正想要的。 – DanielGibbs
它何况,它使用任何安装的信号处理程序,所以你也许可以用它来清理 –