2016-08-16 3 views
1

Предположим, у меня есть петля, которая ждет ввода пользователем. Если пользователь нажимает Ctrl + C, программа завершает работу нормально. Тем не менее, я хотел бы сделать пару вещей перед выходом. Можно ли запустить функцию после нажатия Ctrl + C, и программа собирается выйти?Как запустить определенный код/​​функцию до выхода программы в D?

+1

Вы работаете в Windows или Linux? (или что-то еще) –

ответ

5

Вы можете использовать core.stdc.signal, который содержит привязки к заголовку C signal.h. Теперь, если это для Windows, вы можете столкнуться с некоторыми problems:

SIGINT не поддерживается ни для какого приложения Win32. Когда возникает компромисс между CTRL +, операционные системы 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. Хороший ответ кстати! – DejanLekic

1

Вы могли бы сойти с рук что-то вроде этого:

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

Окончательно блок будет работать, даже если dostuff() бросает Error или Throwable. Я не очень хорошо знаком со стандартными вводами, консольными сигналами и т. Д., Но попробую хотя бы попробовать.

Более того, даже если dostuff() звонит Runtime.terminate(), блок finally все равно будет работать. То же самое нельзя сказать о abort().

+2

, который не будет делать этого в Linux, хотя ctrl + c по умолчанию обходит механизм исключения. –

Смежные вопросы