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.