Signals.cpp revision 01e770a9e556c2b509cbcec83b000bbe9b98053f
11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//===- Signals.cpp - Signal Handling support ------------------------------===// 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This file defines some helpful functions for dealing with the possibility of 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// unix signals occuring while your program is running. 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//===----------------------------------------------------------------------===// 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "Support/Signals.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector> 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <algorithm> 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <cstdlib> 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <cstdio> 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <signal.h> 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic std::vector<std::string> FilesToRemove; 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// IntSigs - Signals that may interrupt the program at any time. 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const int IntSigs[] = { 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SIGHUP, SIGINT, SIGQUIT, SIGKILL, SIGPIPE, SIGTERM, SIGUSR1, SIGUSR2 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const int *IntSigsEnd = IntSigs + sizeof(IntSigs)/sizeof(IntSigs[0]); 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// KillSigs - Signals that are synchronous with the program that will cause it 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// to die. 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const int KillSigs[] = { 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SIGILL, SIGTRAP, SIGABRT, SIGFPE, SIGBUS, SIGSEGV, SIGSYS, SIGXCPU, SIGXFSZ 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef SIGEMT 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci , SIGEMT 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 30}; 31static const int *KillSigsEnd = KillSigs + sizeof(KillSigs)/sizeof(KillSigs[0]); 32 33 34// SignalHandler - The signal handler that runs... 35static void SignalHandler(int Sig) { 36 while (!FilesToRemove.empty()) { 37 std::remove(FilesToRemove.back().c_str()); 38 FilesToRemove.pop_back(); 39 } 40 41 if (std::find(IntSigs, IntSigsEnd, Sig) != IntSigsEnd) 42 exit(1); // If this is an interrupt signal, exit the program 43 44 // Otherwise if it is a fault (like SEGV) reissue the signal to die... 45} 46 47static void RegisterHandler(int Signal) { signal(Signal, SignalHandler); } 48 49// RemoveFileOnSignal - The public API 50void RemoveFileOnSignal(const std::string &Filename) { 51 FilesToRemove.push_back(Filename); 52 53 std::for_each(IntSigs, IntSigsEnd, RegisterHandler); 54 std::for_each(KillSigs, KillSigsEnd, RegisterHandler); 55} 56