在服务器应用程序中处理无限循环中的中断信号的最佳方法是什么?
我开发简单的FTP服务器,其中每个客户端都有自己的线程。现在,我想要做的是处理中断信号,然后中断客户端线程向量中的每个线程。 在每个线程中,我希望有机会在发送/接收某个文件并手动关闭套接字时向客户端发送一些响应。在主线程中,我想只记录服务器已中止并关闭服务器套接字。
我有一个想法,就像单例一样实现我的服务器类FTPServer,并在signal()
中调用一个调用FTPServer实例的方法abort()
的函数。但是我不知道当主无限循环仍在运行时它将会做什么并且accept()
仍在等待新的客户端...而且这种模式我不能在客户端线程中使用,因为不仅有一个实例..
我的方法是:
void FTPServer::run() {
while ( 1 ){
int cliFd = TCPController::acceptClient ( m_serverFD );
serveNewClient(cliFd);
}
}
void FTPServer::serveNewClient( int clientFD ){
m_client_threads.push_back( thread(&FTPServer::clientThread, *this, clientFD) );
}
void FTPServer::clientThread( int clientFD ){
ClientThread client(clientFD);
client.run();
}
所以我想处理中断信号,中断(?)主无限循环并调用abort()方法。 我正在寻找这样的东西:
void FTPServer::run() {
try{
while ( 1 ){
int cliFd = TCPController::acceptClient ( m_serverFD );
serveNewClient(cliFd);
}
catch( RuntimeException & e ){
this.abort()
}
}
但我没有找到任何东西...... :(
在每个客户端线程中我都有无限循环 - 它等待客户端的命令......
那么,拜托,你能告诉我,处理它的最佳方法是什么? 谢谢!
答案 0 :(得分:0)
您有多个线程,每个线程都有自己的循环。你应该做的是确保你的线程经常循环检查它们是否应该中止。因此,不要在acceptClient
上无限期地阻塞,而是接受具有超时的连接。超时到期或接受连接时,检查线程是否应该退出。