2016-08-16 33 views
1

假设我有等待用户输入的循环。如果用户按下Ctrl + C,则程序正常退出。不过,我想在退出前做几件事情。一旦按下Ctrl + C并且程序即将退出,是否可以运行一个函数?如何在程序退出D之前运行某些代码/函数?

+1

您是在Windows还是Linux? (或其他) –

回答

5

您可以使用core.stdc.signal,其中包含与C标头signal.h的绑定。现在,如果这是针对Windows,则可能遇到一些问题problems

对于任何Win32应用程序都不支持SIGINT。当一个 CTRL + C中断发生时,Win32操作系统生成一个新的线程 专门处理该中断。这可能会导致单线程 应用程序(如UNIX中的应用程序)变为多线程并导致意外行为 。

__gshared bool running = true; 
extern(C) void handleInterrupt(int) nothrow @nogc 
{ 
    running = false; 
} 

void main() 
{ 
    import core.stdc.signal; 
    signal(SIGINT, &handleInterrupt); 

    scope(exit) 
    { 
     //Cleanup 
     import std.stdio : writeln; 
     writeln("Done"); 
    } 

    while(running) 
    { 
     //Do some work 
    } 
} 
+2

http://stackoverflow.com/questions/16826097/equivalent-to-sigint-posix-signal-for-catching-ctrlc-under-windows-mingw显示了如何在Windows上完成它。很好回答btw! – DejanLekic

1

你也许可以用这样的侥幸:

void main() { 
    try { 
     dostuff(); 
    } finally { 
     printf("bye\n"); 
    }; 
}; 

如果dostuff()抛出ErrorThrowable的finally块仍将运行。我对标准IO,控制台信号或其他任何东西都不太熟悉,但至少要试一试。

此外,即使dostuff()调用Runtime.terminate(),finally块仍将运行。尽管如此,abort()也不能这么说。

+2

虽然不会在Linux上这样做,但ctrl + c默认绕过异常机制。 –

相关问题