Tomas Hajny wrote 16 lines
On Wed, January 1, 2014 20:48, Mark Morgan Lloyd wrote:
> When reading characters from a program's stdin using fpRead(), what's
> the best way of suppressing ^C so that it doesn't raise SIGTERM or
> whatever? I want to be able to handle signals indicating e.g. a UPS
> power-failure message, but not to get trivial stuff from the keyboard.
>
> Platform is predominantly Linux, possibly also Solaris and one of the
> BSDs. Anybody porting the program to Windows will have to do their own
> dirty work :-)
The general platform independent solution would have been 'Crt.CheckBreak
:= false' (or System.SysSetCtrlBreakHandler without unit Crt should you
not use/need that) - except for the fact that maintainers of most
platforms (all those mentioned by you) decided not to implement/support
this functionality and thus it would not work for those platforms you are
interested in... :-/
Good point. In practice using Crt might be a problem when I come to adding an alternative graphical frontend to the emulator: I think this highlights (as has been discussed elsewhere) the lack of a simple terminal component in Lazarus.
I've played around a bit and find that in Linux (other platforms untested) provided that I add action.Sa_Flags := SA_SIGINFO; I can get the PID inside the signal handler. This is zero for a ^C, which potentially allows one to distinguish between a spurious ^C and a SIGINT sent by kill.
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk
[Opinions above are the author's, not those of his employers or colleagues]