[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bug-gnulib] fatal-signal.c's install_handlers catches ignored signa
From: |
Bruno Haible |
Subject: |
Re: [bug-gnulib] fatal-signal.c's install_handlers catches ignored signals? |
Date: |
Sat, 18 Dec 2004 19:20:50 +0100 |
User-agent: |
KMail/1.5 |
Paul Eggert wrote:
> Normally a program would like to catch SIGHUP and clean up before
> exiting. But when it's invoked by nohup, the program should simply
> ignore SIGHUP.
You're right. I've changed the code to ignore SIG_IGN'd signals.
Bruno
2004-12-18 Bruno Haible <address@hidden>
* 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.
*** lib/fatal-signal.h 14 Oct 2003 12:09:15 -0000 1.2
--- lib/fatal-signal.h 18 Dec 2004 18:20:17 -0000
***************
*** 1,5 ****
/* Emergency actions in case of a fatal signal.
! Copyright (C) 2003 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2003.
This program is free software; you can redistribute it and/or modify
--- 1,5 ----
/* Emergency actions in case of a fatal signal.
! Copyright (C) 2003-2004 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2003.
This program is free software; you can redistribute it and/or modify
***************
*** 26,32 ****
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. */
/* Register a cleanup function to be executed when a catchable fatal signal
occurs.
--- 26,37 ----
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.
!
! 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.
*** lib/fatal-signal.c 14 Oct 2003 12:09:15 -0000 1.2
--- lib/fatal-signal.c 18 Dec 2004 18:20:17 -0000
***************
*** 1,5 ****
/* Emergency actions in case of a fatal signal.
! Copyright (C) 2003 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2003.
This program is free software; you can redistribute it and/or modify
--- 1,5 ----
/* Emergency actions in case of a fatal signal.
! Copyright (C) 2003-2004 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2003.
This program is free software; you can redistribute it and/or modify
***************
*** 54,60 ****
plus
SIGXCPU, SIGXFSZ - because they are quite similar to SIGTERM. */
! static const int fatal_signals[] =
{
/* ISO C 99 signals. */
#ifdef SIGINT
--- 54,60 ----
plus
SIGXCPU, SIGXFSZ - because they are quite similar to SIGTERM. */
! static int fatal_signals[] =
{
/* ISO C 99 signals. */
#ifdef SIGINT
***************
*** 82,87 ****
--- 82,110 ----
#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,117 ****
size_t i;
for (i = 0; i < num_fatal_signals; i++)
! signal (fatal_signals[i], SIG_DFL);
}
--- 134,141 ----
size_t i;
for (i = 0; i < num_fatal_signals; i++)
! if (fatal_signals[i] >= 0)
! signal (fatal_signals[i], SIG_DFL);
}
***************
*** 153,159 ****
size_t i;
for (i = 0; i < num_fatal_signals; i++)
! signal (fatal_signals[i], &fatal_signal_handler);
}
--- 177,184 ----
size_t i;
for (i = 0; i < num_fatal_signals; i++)
! if (fatal_signals[i] >= 0)
! signal (fatal_signals[i], &fatal_signal_handler);
}
***************
*** 165,170 ****
--- 190,196 ----
static bool cleanup_initialized = false;
if (!cleanup_initialized)
{
+ init_fatal_signals ();
install_handlers ();
cleanup_initialized = true;
}
***************
*** 211,219 ****
{
size_t i;
sigemptyset (&fatal_signal_set);
for (i = 0; i < num_fatal_signals; i++)
! sigaddset (&fatal_signal_set, fatal_signals[i]);
fatal_signal_set_initialized = true;
}
--- 237,248 ----
{
size_t i;
+ init_fatal_signals ();
+
sigemptyset (&fatal_signal_set);
for (i = 0; i < num_fatal_signals; i++)
! if (fatal_signals[i] >= 0)
! sigaddset (&fatal_signal_set, fatal_signals[i]);
fatal_signal_set_initialized = true;
}