Mercurial > hg > octave-lojdl > gnulib-hg
changeset 5536:f64f1da7e350
Signals whose handler is set to SIG_IGN are not fatal.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Sat, 18 Dec 2004 18:20:45 +0000 |
parents | 5a898d7a80a6 |
children | 0fc3beabfb42 |
files | lib/ChangeLog lib/fatal-signal.c lib/fatal-signal.h |
diffstat | 3 files changed, 52 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,14 @@ +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".
--- a/lib/fatal-signal.c +++ b/lib/fatal-signal.c @@ -1,5 +1,5 @@ /* 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 @@ -54,7 +54,7 @@ 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 @@ -82,6 +82,29 @@ #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; + } +} + /* ========================================================================= */ @@ -111,7 +134,8 @@ 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); } @@ -153,7 +177,8 @@ 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); } @@ -165,6 +190,7 @@ static bool cleanup_initialized = false; if (!cleanup_initialized) { + init_fatal_signals (); install_handlers (); cleanup_initialized = true; } @@ -211,9 +237,12 @@ { 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; }
--- a/lib/fatal-signal.h +++ b/lib/fatal-signal.h @@ -1,5 +1,5 @@ /* 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 @@ -26,7 +26,12 @@ 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.