On Saturday, 2 December 2017 at 00:41:19 UTC, Wanderer wrote:
I wonder why `scope(exit)` code is not executed when the program is terminated with Ctrl-C.

Which OS?

For example:

```
import std.stdio;
import core.thread;

void main()
{
    scope (exit)
    {
        writeln("Cleanup");
    }
    writeln("Waiting...");
    Thread.sleep(10.seconds);
    writeln("Done waiting...");
}
```

If I wait 10 seconds, I get "Cleanup" output.
But if I use Ctrl-C to terminate the program before 10 seconds elapse, there's no "Cleanup" output.

Is it intentional?

It's normal. Ctrl-C (under UNIX, Linux) sends SIGINT to the process. There are two options:

1. Handle this interrupt in your programm (But then: What about Ctrl-\ and
      SIQUIT)?

2. Prevent the generation of SIGINT: Put the terminal into raw mode [1]

Is there any method to cleanup on Ctrl-C?

Yes. Take option 1. or option 2.

[1] https://linux.die.net/man/3/cbreak

"The raw and noraw routines place the terminal into or out of raw mode. Raw mode is similar to cbreak mode, in that characters typed are immediately passed through to the user program. The differences are that in raw mode, the interrupt, quit, suspend, and flow control characters are all passed through uninterpreted, instead of generating a signal. The behavior of the BREAK key depends on other bits in the tty driver that are not set by curses."

Reply via email to