Windows Ctrl-C - 在命令行应用程序中清理本地堆栈对象

Posted

技术标签:

【中文标题】Windows Ctrl-C - 在命令行应用程序中清理本地堆栈对象【英文标题】:Windows Ctrl-C - Cleaning up local stack objects in command line app 【发布时间】:2011-09-19 17:51:25 【问题描述】:

我正在编写一个控制台应用程序 Windows,它在主线程中创建一些对象并将这些对象启动到一个循环中,仅在用户使用 Ctrl-C 中断时退出。

现在,我已经阅读了一些关于如何编写适当的中断处理程序的文章:http://msdn.microsoft.com/en-us/library/ms685049%28VS.85%29.aspx,但我仍然对一件事感到困惑。似乎中断处理程序为本地对象清理留下了有限的范围。例如,如果我有这样的处理程序:

BOOL CtrlHandler ( DWORD fdwCtrlType )
  ... handle Ctrl-C 

我的主要看起来像这样:

int main() 
      DBClient db;
      DataPuller p;

      while (true) 
           ... do stuff until Ctrl-C comes in
      

即使我抓住了 Ctrl-C,似乎也没有办法在不将它们声明为全局变量的情况下对变量 db 和 p 进行适当的清理,我通常会远离它们。

有没有更好的方法来做到这一点,还是我遗漏了一些明显的东西?谢谢。

【问题讨论】:

为什么你需要清理任何东西 - 这些是自动变量,当你退出函数范围时它们应该清理自己。 @Kerrek:Ctrl-C 向进程发送 SIGINT 信号。如果不处理,这会导致应用程序中止(不从信号处理程序返回)。因此不会清理自动变量。 @Tux:我认为 OP 已经安装了一个信号处理程序,它只会设置一个适当的退出条件。 【参考方案1】:

您在条件变量上创建循环。

当您收到 ctrl-C (SIGINT) 时,您将条件变量设置为 false 并返回。 然后循环将正常退出。

bool finished = false;

int main()

      DBClient db;
      DataPuller p;

      while (!finished)
      
           // ... do stuff until Ctrl-C comes in
      


// Signal handler or Control handler on windows
// Set finished = true.

【讨论】:

【参考方案2】:

我认为如果没有至少一个全局变量就无法做到这一点。但是,我认为您只需要一个:

BOOL is_shutting_down = false;

BOOL CtrlHandler ( DWORD fdwCtrlType ) 
    switch( fdwCtrlType ) 
     
        // Handle the CTRL-C signal. 
        case CTRL_C_EVENT: 
            is_shutting_down = true;
            return( TRUE );
    


int main() 
      DBClient db;
      DataPuller p;

      while (is_shutting_down == false) 
           ... do stuff until Ctrl-C comes in
      

      //objects clean themselves automatically.

全局“is_shutting_down”的一个副作用是,如果它设置为 true,则析构函数不需要释放内存,因为操作系统会自动回收所有内存,如果您有大量的小分配。

【讨论】:

以上是关于Windows Ctrl-C - 在命令行应用程序中清理本地堆栈对象的主要内容,如果未能解决你的问题,请参考以下文章

QApplication:如何在 Ctrl-C 上正常关机

PySerial:如何在串行线上发送 Ctrl-C 命令

Unbun命令行运行后台程序方法

如何在不使用 ctrl-c 的情况下停止烧瓶应用程序

在linux的终端怎么退出python命令行

windows 控制台(命令行)程序暂停问题