bug-gnulib
[Top][All Lists]
Advanced

[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;
      }





reply via email to

[Prev in Thread] Current Thread [Next in Thread]