Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 08 Oct 2009 13:38:16 +0200
From:      Matthias Andree <matthias.andree@gmx.de>
To:        Stephen Hocking <stephen.hocking@gmail.com>
Cc:        ports@freebsd.org
Subject:   Re: sigwait - differences between Linux & FreeBSD
Message-ID:  <4ACDCF28.6040807@gmx.de>
In-Reply-To: <6300771b0910071753s6580c099i8c348824a6fe1a72@mail.gmail.com>
References:  <6300771b0910071753s6580c099i8c348824a6fe1a72@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Stephen Hocking schrieb:
> Hi all,
> 
> In my efforts to make the xrdp port more robust under FreeBSD, I have
> discovered that sigwait (kind of an analogue to select(2), but for
> signals rather than I/O) re-enables ignored signals in its list under
> Linux, but not FreeBSD.

If the application relies on sigwait() to wait for and extract an ignored signal
(SIG_IGN), it is non-portable, as it expects non-POSIX semantics, and should be
fixed by the upstream maintainer (I haven't checked that).

Note: Linux has the same semantics, quoting its manual page (on Ubuntu 9.10 beta):

       sigwait  suspends the calling thread until one of the signals in set is
       delivered to the calling thread. It then stores the number of the  sig‐
>      nal received in the location pointed to by sig and returns. The signals
>      in set must be blocked and not ignored on entrance to sigwait.  If  the
       delivered  signal has a signal handler function attached, that function
       is not called.

> The sesman daemon uses SIGCHLD to clean up after a session has exited. Under
> Linux this works OK, under FreeSBD it doesn't.

Not sure I understand. How can it clean up if it's not made aware of child's
termination? Or do some Linux kernels behave in another way?

Setting SIGCHLD to SIG_IGN (default) means that the kernel will let go of the
child processes as they exit, rather than turn them into zombies. You cannot
wait() for them though.

> I have worked around it in a very hackish manner (define a
> dummy signal handler and enable it using signal, which means that the
> sigwait call can then be unblocked by it), but am wondering if anyone
> else has run across the same problem, and if so, if they fixed it in
> an elegant manner. Also, does anyone know the correct semantics of
> sigwait under this situation?

That is not a hackish workaround, but one of the few safe ways to sigwait() for
SIGCHLD. A version fixed thus should still work on Linux, so that fix should be
made by xrdp upstream.


The canonical reference would be the POSIX standard (IEEE Std 1003.1).

2008: http://www.opengroup.org/onlinepubs/9699919799/

2001, 2004 edition: http://www.opengroup.org/onlinepubs/000095399/

The latter is also known as the Single Unix Specification v3 (SUSv3).

HTH



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4ACDCF28.6040807>