+2004-12-18 Bruno Haible <bruno@clisp.org>
+
+ * fatal-signal.c (fatal_signals): Make non-const.
+ (init_fatal_signals): New function.
+ (uninstall_handlers, install_handlers): Ignore signals that were set to
+ SIG_IGN.
+ (at_fatal_signal): Call init_fatal_signals.
+ (init_fatal_signal_set): Likewise. Ignore signals that were set to
+ SIG_IGN.
+ Reported by Paul Eggert.
+
2004-12-08 Paul Eggert <eggert@cs.ucla.edu>
* getdate.y (textint): New member "negative".
/* Emergency actions in case of a fatal signal.
- Copyright (C) 2003 Free Software Foundation, Inc.
+ Copyright (C) 2003-2004 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2003.
This program is free software; you can redistribute it and/or modify
plus
SIGXCPU, SIGXFSZ - because they are quite similar to SIGTERM. */
-static const int fatal_signals[] =
+static int fatal_signals[] =
{
/* ISO C 99 signals. */
#ifdef SIGINT
#define num_fatal_signals (SIZEOF (fatal_signals) - 1)
+/* Eliminate signals whose signal handler is SIG_IGN. */
+
+static void
+init_fatal_signals (void)
+{
+ static bool fatal_signals_initialized = false;
+ if (!fatal_signals_initialized)
+ {
+ size_t i;
+
+ for (i = 0; i < num_fatal_signals; i++)
+ {
+ struct sigaction action;
+
+ if (sigaction (fatal_signals[i], NULL, &action) >= 0
+ && action.sa_handler == SIG_IGN)
+ fatal_signals[i] = -1;
+ }
+
+ fatal_signals_initialized = true;
+ }
+}
+
/* ========================================================================= */
size_t i;
for (i = 0; i < num_fatal_signals; i++)
- signal (fatal_signals[i], SIG_DFL);
+ if (fatal_signals[i] >= 0)
+ signal (fatal_signals[i], SIG_DFL);
}
size_t i;
for (i = 0; i < num_fatal_signals; i++)
- signal (fatal_signals[i], &fatal_signal_handler);
+ if (fatal_signals[i] >= 0)
+ signal (fatal_signals[i], &fatal_signal_handler);
}
static bool cleanup_initialized = false;
if (!cleanup_initialized)
{
+ init_fatal_signals ();
install_handlers ();
cleanup_initialized = true;
}
{
size_t i;
+ init_fatal_signals ();
+
sigemptyset (&fatal_signal_set);
for (i = 0; i < num_fatal_signals; i++)
- sigaddset (&fatal_signal_set, fatal_signals[i]);
+ if (fatal_signals[i] >= 0)
+ sigaddset (&fatal_signal_set, fatal_signals[i]);
fatal_signal_set_initialized = true;
}
/* Emergency actions in case of a fatal signal.
- Copyright (C) 2003 Free Software Foundation, Inc.
+ Copyright (C) 2003-2004 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2003.
This program is free software; you can redistribute it and/or modify
terminates the process, like removing a temporary file or killing a
subprocess that may be stuck waiting for a device, pipe or network input.
Such signals are SIGHUP, SIGINT, SIGPIPE, SIGTERM, and possibly others.
- The limitation of this facility is that it cannot work for SIGKILL. */
+ The limitation of this facility is that it cannot work for SIGKILL.
+
+ Signals with a SIG_IGN handler are considered to be non-fatal. The
+ functions in this file assume that when a SIG_IGN handler is installed
+ for a signal, it was installed before any functions in this file were
+ called and it stays so for the whole lifetime of the process. */
/* Register a cleanup function to be executed when a catchable fatal signal
occurs.