在服务器应用程序中处理中断信号的最佳方法?
Posted
技术标签:
【中文标题】在服务器应用程序中处理中断信号的最佳方法?【英文标题】:Best way to handle an interrupt signal in server app? 【发布时间】:2014-04-29 21:00:57 【问题描述】:在服务器应用程序的无限循环中处理中断信号的最佳方法是什么?
我开发了简单的 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();
所以我想处理中断信号,break(?) 主无限循环并调用 abort() 方法。 我正在寻找这样的东西:
void FTPServer::run()
try
while ( 1 )
int cliFd = TCPController::acceptClient ( m_serverFD );
serveNewClient(cliFd);
catch( RuntimeException & e )
this.abort()
但我什么也没找到.. :(
在每个客户端线程中,我也有无限循环 - 它等待客户端的命令...
那么,请你告诉我,最好的处理方法是什么? 谢谢!
【问题讨论】:
【参考方案1】:您有多个线程,每个线程都有自己的循环。你应该做的是确保你的线程循环经常检查它们是否应该被中止。所以不要无限期地阻塞acceptClient
,而是接受一个超时的连接。当超时到期或接受连接时,检查线程是否应该退出。
【讨论】:
以上是关于在服务器应用程序中处理中断信号的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章