[Mono-dev] Control-C handler

Michi Henning michi at zeroc.com
Wed Jan 2 14:41:43 EST 2008


Jonathan Pryor wrote:
> So why can't setting a volatile variable within a signal handler be
> supported?  And/or use a Constrained Execution Region to *ensure* that
> the signal handler is JITed before the signal is emitted (does mono even
> support CERs yet?)?
>   
Something to support signal handling would definitely be useful. I'm 
currently in the situation
where I'm maintaining a code base that must run on both .NET and Mono. 
The code is
a middleware library (www.zeroc.com) that must allow allow applications 
to react to
signals so they can shut down themselves and the Ice run time in an 
orderly fashion.

Under Windows, the code uses P/Invoke to call SetConsoleCtrlHandler so 
it can
intercept Ctrl-C, Ctrl-Break, and shutdown, logoff, and window closure. 
With Mono,
I'm pretty much stuck because there is no equivalent mechanism. As far 
as I can see, the only
option to achieve equivalent functionality is to create a C library that 
sets the necessary
signal handlers and to then P/Invoke into that library from my C# Mono 
code. But that
sort of defeats the purpose because I'd rather not ship a DLL for every 
possible platform
Mono runs on.

Console.CancelKeyPress, which was added with .NET 2.0, unfortunately 
doesn't work for
this purpose: it only intercepts keyboard interrupts, but doesn't 
trigger on logoff, shutdown, or
window closure.

One could argue that all this is a limitation of .NET, which should 
offer a way to reliably
intercept process termination. But, under Windows, I at least get an 
acceptable work-around
in the form of SetConsoleCtrlHandler whereas, with Mono, I don't.

So, anything to improve on this situation would be great. While I 
understand all the arguments
about what can and can't safely be done from within a signal handler, 
the need to react to
signals and perform some clean-up before a process goes away is a 
real-world requirement.
If Mono offered at least rudimentary support for signal handling that 
doesn't require P/Invoke
and external non-standard libraries, it would at least allow me to then 
build something on top
of that. Right now, I can't do anything much at all, as far as I can see.

Cheers,

Michi.



More information about the Mono-devel-list mailing list