Segfault in signal handler

From: Matt (m_at_m.net)
Date: 09/28/03


Date: Sun, 28 Sep 2003 04:13:58 GMT


It happens occasionally when CTRL-c myapp. But up to now, "skill TERM myapp"
will never fall into a segfault.
Below is my one and only signal handler, and what is :(possible) reason for
this?

TIA

-matt

//code snippet
void
sig_int(int signo)
{
if (g_signaled)
raise (signo);
g_signaled = 1;
keepgoing = 0;
g_signo = signo;
signal(SIGINT, SIG_DFL);
signal(SIGQUIT, SIG_DFL);
signal(SIGTERM, SIG_DFL);
signal(SIGBUS, SIG_DFL);
signal(SIGSEGV, SIG_DFL);
signal(SIGABRT, SIG_DFL);
signal(SIGFPE, SIG_DFL);
signal(SIGSYS, SIG_DFL);
signal(SIGXFSZ, SIG_DFL);
signal(SIGUSR1, SIG_DFL);
signal(SIGUSR2, SIG_DFL);
raise (signo);
}

///////// and here is what in "main"
...
signal(SIGPIPE, SIG_IGN);
sigemptyset(&mask);
sigemptyset(&oldmask);
install_handles(&mask);
sigprocmask (SIG_BLOCK, &mask, &oldmask);
while(keepgoing) {
  sigsuspend(&oldmask);
 }
app_clean();
signal_get(g_signo);
signal_notify(g_msg);
#ifdef NDEBUG
syslog(LOG_NOTICE, " %s", g_msg);
#endif
sleep(18);
sigprocmask (SIG_UNBLOCK, &mask, NULL);
...

///////

void install_handles( sigset_t *pmask)
{
struct sigaction new_act, old_act;
new_act.sa_handler = sig_int;
sigemptyset (&new_act.sa_mask);
new_act.sa_flags = 0;
sigaction (SIGINT, NULL, &old_act);
if (old_act.sa_handler != SIG_IGN) {
sigaction (SIGINT, &new_act, NULL);
sigaddset(pmask, SIGINT);
...

}