home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / SignalC.C < prev    next >
C/C++ Source or Header  |  1998-03-25  |  4KB  |  147 lines

  1. // $Id: SignalC.C,v 1.9 1998/03/25 12:44:13 zeller Exp $
  2. // Call destructors on signal
  3.  
  4. // Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char SignalCatcher_rcsid[] = 
  30.     "$Id: SignalC.C,v 1.9 1998/03/25 12:44:13 zeller Exp $";
  31.  
  32. #include <stdio.h>
  33. #include <signal.h>
  34. #include <stdlib.h>
  35.  
  36. #include "SignalC.h"
  37. #include "AgentM.h"
  38. #include "sigName.h"
  39.  
  40. #ifdef __GNUG__
  41. extern "C" {
  42. #if __GNUG__ < 2
  43.     void __do_global_cleanup(void);
  44. #else
  45.     void __do_global_dtors(void);
  46. #endif
  47.     void _exit(int);
  48.     void _cleanup();
  49. }
  50. #endif
  51.  
  52. #ifndef EXIT_SUCCESS
  53. #define EXIT_SUCCESS 0
  54. #endif
  55.  
  56. #ifndef EXIT_FAILURE
  57. #define EXIT_FAILURE 1
  58. #endif
  59.  
  60.  
  61. // Kill all agents when an interrupt signal is received
  62. static void cleanupOnSignal(int sig)
  63. {
  64.     // restore default action (if we're killed another time, this will make it)
  65.     signal(sig, SignalProc(SIG_DFL));
  66.  
  67.     fprintf(stderr, "%s\nCleaning up... ", sigName(sig));
  68.  
  69. #ifdef __GNUG__
  70. #if __GNUG__ < 2
  71.     // Using a GNU compiler, we can call the cleanup actions
  72.     // directly, rather than going through exit().
  73.     __do_global_cleanup();
  74. #else
  75.     // same for version 2.0 and above
  76.     __do_global_dtors();
  77. #endif
  78. #endif
  79.  
  80.     fprintf(stderr, "done.\n");
  81.  
  82. #ifdef __GNUG__
  83. #ifdef sun
  84.     // Using a SUN, we can also close all open files
  85.     _cleanup();
  86. #endif
  87.     // Now exit gracefully, without calling destructors
  88.     _exit(EXIT_FAILURE);
  89. #else
  90.     // Exit gracefully: this calls all destructors (but leaves no core)
  91.     exit(EXIT_FAILURE);
  92. #endif
  93. }
  94.  
  95.  
  96.  
  97. // Constructor: catch them all
  98. SignalCleanup::SignalCleanup()
  99. {
  100.     // if $NO_SIGNAL_CLEANUP is set, don't do anything
  101.     if (getenv("NO_SIGNAL_CLEANUP") != NULL)
  102.     return;
  103.  
  104.     // catch "typical" interrupt signals
  105.  
  106. #ifdef SIGHUP
  107.     signal(SIGHUP,  cleanupOnSignal);    // hangup
  108. #endif
  109.  
  110. #ifdef SIGINT
  111.     signal(SIGINT,  cleanupOnSignal);    // interrupt
  112. #endif
  113.  
  114. #ifdef SIGQUIT
  115.     signal(SIGQUIT, cleanupOnSignal);    // quit
  116. #endif
  117.  
  118. #ifdef SIGILL
  119.     signal(SIGILL,  cleanupOnSignal);    // illegal instruction
  120. #endif
  121.  
  122. #ifdef SIGABRT
  123.     signal(SIGABRT, cleanupOnSignal);    // abort
  124. #endif
  125.  
  126. #ifdef SIGFPE
  127.     signal(SIGFPE,  cleanupOnSignal);    // floating point exception
  128. #endif
  129.  
  130. #ifdef SIGBUS
  131.     signal(SIGBUS,  cleanupOnSignal);    // bus error
  132. #endif
  133.  
  134. #ifdef SIGSEGV
  135.     signal(SIGSEGV, cleanupOnSignal);    // segmentation violation
  136. #endif
  137.  
  138. #ifdef SIGSYS
  139.     signal(SIGSYS,  cleanupOnSignal);    // bad argument to system call
  140. #endif
  141.  
  142. #ifdef SIGTERM
  143.     signal(SIGTERM, cleanupOnSignal);    // software termination signal
  144. #endif
  145.  
  146. }
  147.