List Info

Thread: Re: Sane exit from a program on receipt of a signal




Re: Sane exit from a program on receipt of a signal
user name
2007-07-25 09:36:39
On Jul 25,  4:46pm, lukemNetBSD.org (Luke Mewburn)
wrote:
-- Subject: Re: Sane exit from a program on receipt of a
signal

| I've thought about that, and I'm not convinced that we
need to.
| 
| Here's a minor rewrite of my 2nd attempt, based on some
| feedback I received privately from a friend.
| Changes:
| 
|  * Highlight that memset() isn't technically async safe
per signal(7).
|    I thought about removing it entirely, but as you &
I chatted
|    privately, memset() should be safe. (why wouldn't it
be??)
|    I want to avoid C99 features to zero it.
|    The function should be portable to other platforms,
|    which means we shouldn't assume BSD extensions like
|    sigaction.sa_sigaction are present to explicitly zero.
|    OTOH, autoconf can solve that problem 
| 
|  * (Temporarily) block the signal whilst we set the
default handler.
| 
|  * Raise the signal and then unblock it.
| 
| I've also renamed it to 'raise_default_signal()'
| 
| 
| 
| --3loezlmesXOUD0D5
| Content-Type: text/plain; charset=us-ascii
| Content-Disposition: attachment;
filename="raise_default.c"
| 
| #include <signal.h>
| #include <stdio.h>
| #include <string.h>
| 
| int
| raise_default_signal(int sig)
| {
| 	struct sigaction act;
| 	sigset_t mask;
| 
| 		/* Block the signal */
| 	if ((sigemptyset(&mask) == -1) ||
| 	    (sigaddset(&mask, sig) == -1) ||
| 	    (sigprocmask(SIG_BLOCK, &mask, NULL) == -1))
| 		return -1;
| 
| 		/* Setup default handler */
| 	memset(&act, 0, sizeof(&act));	/* XXX not async
safe per signal(7) */

That should read sizeof(act)... cast memset to void to
appease lint.

| 	act.sa_handler = SIG_DFL;
| 	act.sa_flags = 0;
| 	if (sigemptyset(&act.sa_mask) == -1)
| 		return -1;
| 
| 		/* Restore the default handler, raise the signal */
| 	if ((sigaction(sig, &act, NULL) == -1) ||
| 	    (raise(sig) == -1))
| 		return -1;
| 
| 		/* Unblock the signal */
| 	if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1)
| 		return -1;
| 
| 	return 0;
| }

I think that it is pretty simple to cleanup so why trash the
signal
disposition and mask state? And if you are going to block
signals,
why not block all of them with sigfillset(), instead of
blocking
just that one? Then you can unblock only the signal you
want
delivered.

christos

Re: Sane exit from a program on receipt of a signal
country flaguser name
Australia
2007-09-23 22:34:58
On Wed, Jul 25, 2007 at 10:36:39AM -0400, Christos Zoulas wrote: | I think that it is pretty simple to cleanup so why trash the signal | disposition and mask state? And if you are going to block signals, | why not block all of them with sigfillset(), instead of blocking | just that one? Then you can unblock only the signal you want | delivered. How's this? cheers, Luke.
  Approximate file size 1919 bytes
[1-2]

about | contact  Other archives ( Real Estate discussion Medical topics )