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

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,而是接受一个超时的连接。当超时到期或接受连接时,检查线程是否应该退出。

【讨论】:

以上是关于在服务器应用程序中处理中断信号的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

FreeRTOS--二元信号量--任务与中断的同步

Linux高性能服务器编程信号处理方法之统一事件源

中断简介

PHP 信号中断系统

小内核操作系统中中断和任务之间的信号

25 服务接口的结构