在服务器应用程序中处理中断信号的最佳方法?

时间:2014-04-29 21:00:57

标签: c++ multithreading sockets

在服务器应用程序中处理无限循环中的中断信号的最佳方法是什么?

我开发简单的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()
    }
}

但我没有找到任何东西...... :(

在每个客户端线程中我都有无限循环 - 它等待客户端的命令......

那么,拜托,你能告诉我,处理它的最佳方法是什么? 谢谢!

1 个答案:

答案 0 :(得分:0)

您有多个线程,每个线程都有自己的循环。你应该做的是确保你的线程经常循环检查它们是否应该中止。因此,不要在acceptClient上无限期地阻塞,而是接受具有超时的连接。超时到期或接受连接时,检查线程是否应该退出。