[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: SIGINT handling
I'm sort-of confused that es doesn't do this, but isn't it always
safe to re-arm the signal handler? That's what I do in my code...
no. if you get two signals before you get a chance to reinstate
the handler, you're stuffed. here's some things i use:
#ifdef USE_SIGACTION
typedef RETSIGTYPE sigfunc _((int));
sigfunc *my_signal _((int, sigfunc *, int));
# define MY_SIGNAL(s_n, s_h, m_f) my_signal(s_n, s_h, m_f)
#else
# if USE_SIGSET
# define MY_SIGNAL(s_n, s_h, m_f) sigset(s_n, s_h)
# else
# define MY_SIGNAL(s_n, s_h, m_f) signal(s_n, s_h)
# endif /* USE_SIGSET */
#endif /* USE_SIGACTION */
where you've previously defined the USE_* and RETSIGTYPE's.
and the my_signal() looks like this:
/*
* ircsig.c: has a `my_signal()' that uses sigaction().
*
* written by matthew green, 1993.
*
* i stole bits of this from w. richard stevens' `advanced programming
* in the unix environment' -mrg
*/
#ifndef lint
static char rcsid[] = "@(#)$Id: ircsig.c,v 1.3 1994/07/02 02:32:13 mrg Stab $";
#endif
#include "irc.h"
#include "irc_std.h"
#ifdef USE_SIGACTION
sigfunc *
my_signal(sig_no, sig_handler, misc_flags)
int sig_no;
sigfunc *sig_handler;
int misc_flags;
{
/*
* misc_flags is unused currently. it's planned to be used
* to use some of the doovier bits of sigaction(), if at
* some point we need them, -mrg
*/
struct sigaction sa, osa;
sa.sa_handler = sig_handler;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, sig_no);
/* this is ugly, but the `correct' way. i hate c. -mrg */
sa.sa_flags = 0;
#if defined(SA_RESTART) || defined(SA_INTERRUPT)
if (SIGALRM == sig_no)
{
# if defined(SA_INTERRUPT)
sa.sa_flags |= SA_INTERRUPT;
# endif /* SA_INTERRUPT */
}
else
{
# if defined(SA_RESTART)
sa.sa_flags |= SA_RESTART;
# endif /* SA_RESTART */
}
#endif /* SA_RESTART || SA_INTERRUPT */
if (0 > sigaction(sig_no, &sa, &osa))
return (SIG_ERR);
return (osa.sa_handler);
}
#endif /* USE_SIGACTION */
---
and then you use it like this:
(void) MY_SIGNAL(SIGINT, cntl_c, 0);
i've also got the SYSVSIGNALS stuff in the signal handlers
themselves -if- we don't have any real signals.
.mrg.