Как обрабатывать SIGINT в программе, использующей блок CRT?

У меня есть консольное приложение (program), в котором используется модуль CRT. В Linux, когда я нажимаю CTRL+C, ничего не происходит. Однако я хочу обработать этот сигнал SIGINT, как и следовало ожидать (немедленно выйдя из программы). Я нашел некоторое уведомление о том, что использование CRT переопределяет материал STDIN и STDOUT, так что обычные обработчики SIG не работают. В настоящее время я пробовал fpSignal(SIGINT, SignalHandler(@DoSig));, но все еще нажатие CTRL+C ничего не делает. Когда я отправляю SIGINT процессу вручную (через htop), срабатывает обработчик. Но не с помощью CTRL+C. К сожалению, не использовать CRT блок не вариант.

Любая помощь приветствуется :)


person andreas-h    schedule 28.01.2013    source источник
comment
Что вы называете блоком ЭЛТ? Ты про экран? Какой-нибудь эмулятор терминала под X11? В наши дни большинство компьютеров имеют ЖК-экран...   -  person Basile Starynkevitch    schedule 29.01.2013
comment
И вы должны показать свой исходный код, чтобы получить помощь. Читали ли вы advancedlinuxprogramming.com и kernel.org/doc/man-pages/online/pages/man7/signal.7.html   -  person Basile Starynkevitch    schedule 29.01.2013
comment
под модулем CRT я имею в виду модуль CRT freepascal: freepascal.org/docs-html/rtl /crt   -  person andreas-h    schedule 29.01.2013


Ответы (1)


Причина в том, что блок CRT будет перенаправлять стандартные дескрипторы ввода/вывода, поэтому вам придется проверять SIGINT «вручную», обработчик сигнала не будет работать. Вы должны проверить нажатую клавишу с помощью функции KeyPressed, а затем проверить с помощью ReadKey, был ли отправлен SIGINT (например: Ctrl-C).

person cezar    schedule 19.05.2013