【发布时间】:2016-12-23 01:40:06
【问题描述】:
假设我有循环等待用户输入。如果用户按下 Ctrl+C,程序将正常退出。但是,我想在退出之前做几件事。是否可以在按下 Ctrl+C 并且程序即将退出时运行函数?
【问题讨论】:
-
您使用的是 Windows 还是 Linux? (或其他)
假设我有循环等待用户输入。如果用户按下 Ctrl+C,程序将正常退出。但是,我想在退出之前做几件事。是否可以在按下 Ctrl+C 并且程序即将退出时运行函数?
【问题讨论】:
你可能会逃脱这样的事情:
void main() {
try {
dostuff();
} finally {
printf("bye\n");
};
};
即使dostuff() 抛出Error 或Throwable,finally 块也会运行。我对标准 IO、控制台信号或其他什么东西不是很熟悉,但至少可以尝试一下。
此外,即使dostuff() 调用Runtime.terminate(),finally 块仍然会运行。不过abort() 就不是这样了。
【讨论】:
您可以使用 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
}
}
【讨论】: