Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.programming.threads > #1998
| From | Rainer Weikusat <rweikusat@mobileactivedefense.com> |
|---|---|
| Newsgroups | comp.programming.threads, comp.unix.programmer |
| Subject | Re: Combination of sigwait() with sigaction()? |
| Date | 2013-11-21 17:32 +0000 |
| Message-ID | <87vbzl7jaa.fsf@sable.mobileactivedefense.com> (permalink) |
| References | <bf6rviFm5kiU1@mid.individual.net> <87zjox7kn9.fsf@sable.mobileactivedefense.com> |
Cross-posted to 2 groups.
Rainer Weikusat <rweikusat@mobileactivedefense.com> writes:
> Markus Elfring <Markus.Elfring@web.de> writes:
>> I have found an interesting article about waiting for signals in a separate
>> thread. A source code skeleton is shown.
>> http://devcry.heiho.net/2009/05/pthreads-and-unix-signals.html
>>
>> The author suggested also to install an empty signal handler by the function
>> "sigaction". How do you think about this suggestion?
>> Is the mentioned indication of non-default signal actions useful here?
>
> The author is somewhat confused here: sigwait returns "pending signals",
> this means "signals which don't cause any 'action' because they're
> blocked", hence, no "default actions" will happen. But the disposition
> of a signal can be set to something other than "default action" or "signal
> handler", namely, to "ignore this signals" and signals set to be ignored
> don't become pending signals, they're just discarded (and hence, sigwait
> will never return them). The main annoyance here is that the default
> disposition of SIGCHLD is "ignore", hence, without setting that to
> something else, sigwait (and similar routines) will never return a
> SIGCHLD.
SUS actually leaves this (immedidately discarding ignored signals)
unspecified and at least on the two systems where I tested this (running
Linux 3.2.9 and Linux 2.6.36.4), this program
----------
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
static void child(void)
{
sleep(1);
fputs("\tchild going down\n", stderr);
_exit(0);
}
static void dummy(int unused)
{}
int main(void)
{
sigset_t wanted;
int sig;
sigemptyset(&wanted);
sigaddset(&wanted, SIGINT);
sigaddset(&wanted, SIGCHLD);
sigprocmask(SIG_BLOCK, &wanted, NULL);
if (fork() == 0) child();
sigwait(&wanted, &sig);
fprintf(stderr, "got signal %d\n", sig);
signal(SIGCHLD, dummy);
if (fork() == 0) child();
sigwait(&wanted, &sig);
fprintf(stderr, "got signal %d\n", sig);
return 0;
}
------------
does indicate that a SIGCHLD was received in both cases. I remember
running into lost SIGCHLDs in the past, though, that's why I started to
install dummy handlers for everything I wanted to handle via
sigwaitsomething.
Back to comp.programming.threads | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
Combination of sigwait() with sigaction()? Markus Elfring <Markus.Elfring@web.de> - 2013-11-21 17:50 +0100
Re: Combination of sigwait() with sigaction()? Rainer Weikusat <rweikusat@mobileactivedefense.com> - 2013-11-21 17:02 +0000
Re: Combination of sigwait() with sigaction()? Rainer Weikusat <rweikusat@mobileactivedefense.com> - 2013-11-21 17:32 +0000
Re: Combination of sigwait() with sigaction()? Markus Elfring <Markus.Elfring@web.de> - 2013-11-21 18:38 +0100
Re: Combination of sigwait() with sigaction()? "Chris M. Thomasson" <no@spam.invalid> - 2013-11-21 14:52 -0800
csiph-web