[Mono-dev] mono-service bugs

Jonathan Pryor jonpryor at vt.edu
Mon Feb 4 14:12:48 EST 2008

On Mon, 2008-02-04 at 12:14 -0500, Avery Pennarun wrote:
> I have my service running fine, but as background, I've discovered at
> least these problems:
> 1. mono-service runner doesn't catch SIGINT (it should clean up like
> SIGTERM, and this is especially important when using the --debug
> option).

Not as easy as you'd think; check the archives with the "Control-C
handler" subject.  To reliably catch SIGINT/SIGTERM/etc., you'll need to
use UnixSignal, which was just added to svn-HEAD.  If I'm lucky, I'll
get the tests written to permit it to go into 1.9 soon.

> 4. Environment.UserInteractive should be false when run as a service
> but true when run as a normal user; in Mono, it's always false (see
> corlib/System/Environment.cs).
> All of these are probably very easy fixes except #4, which is why I'm
> asking here instead of just filing the bug or submitting a patch.
> What does "interactive" mean in mono? ...  In Unix, it's unclear: even
> daemons might have a stderr (albeit not one they should usually be
> using) and even user-level applications might not be able to pop up
> dialogs.

Mono itself doesn't close stdin, stdout, or stderr, so even a
mono-service-based app will still have stdin/stdout/stderr (unless/until
mono-service actually closes those file descriptors).

> I would be happy to submit a fix for Environment.UserInteractive, but
> it's not obvious how we should do it.  Would checking for a valid
> stdin work?

Unless mono-service is modified to close stdin, this won't work.

>   Or maybe it should always be true except when
> mono-service explicitly makes it false somehow?

This makes more sense.

>   Does mono-service
> have access to internal methods that would let it poke at environment
> settings like that?

You can [DllImport("__Internal")] to obtain functions within the mono
executable, or (better) you can add an internal call to Mono that
mono-service would make use of.  Environment.UserInteractive could then
use a different internal call to obtain the value of some variable,
permitting communication (via internal calls) between mono-service and
System.Environment.  This is likely the best solution.

 - Jon

More information about the Mono-devel-list mailing list