whileループからCtrl-Cで抜ける処理を横取りしたいときに。
import std.stdio; import core.thread; import core.stdc.stdlib; import core.sys.posix.signal; extern (C) { void cleanup(int signal) { writeln("cleanup"); exit(1); } } void main() { sigset(SIGINT, &cleanup); while (true) { writeln("waiting..."); Thread.sleep(dur!("seconds")(1)); } }
ポイントはクリーンナップコードをextern (C) { ... }
の中で定義することと、integer型の引数を与えること。
SIGINT以外にもいろいろハンドラが登録できるっぽい。ちなみにちゃんとexitしないと、killコマンドで殺さないといけなくなるので注意。