【问题标题】:How do I run certain code/function before the program exits in D?在程序退出 D 之前,如何运行某些代码/函数?
【发布时间】:2016-12-23 01:40:06
【问题描述】:

假设我有循环等待用户输入。如果用户按下 Ctrl+C,程序将正常退出。但是,我想在退出之前做几件事。是否可以在按下 Ctrl+C 并且程序即将退出时运行函数?

【问题讨论】:

  • 您使用的是 Windows 还是 Linux? (或其他)

标签: d exit exit-code


【解决方案1】:

你可能会逃脱这样的事情:

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

即使dostuff() 抛出ErrorThrowable,finally 块也会运行。我对标准 IO、控制台信号或其他什么东西不是很熟悉,但至少可以尝试一下。

此外,即使dostuff() 调用Runtime.terminate(),finally 块仍然会运行。不过abort() 就不是这样了。

【讨论】:

  • 虽然在 Linux 上不会这样做,但 ctrl+c 默认会绕过异常机制。
【解决方案2】:

您可以使用 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
    }
}

【讨论】:

猜你喜欢
  • 2023-02-22
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2011-04-20
  • 2017-05-16
  • 2014-03-25
相关资源
最近更新 更多