1 // KERNEL Utils : common utils for KERNEL
2 // Copyright (C) 2003 CEA
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // Lesser General Public License for more details.
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 // See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
26 #include "Utils_SignalsHandler.h"
29 //============================================================================
31 //purpose : univisal handler for signals
32 //============================================================================
33 static void Handler(int theSigId)
35 char aMessage[256] = "";
36 sprintf(aMessage,"Signal with ID = %d was cautch!",theSigId);
37 throw std::runtime_error(aMessage);
41 //=======================================================================
42 //function : SetSigHandler
43 //purpose : Redefine signal handlers. If the handler of the signal is
44 // set as SIG_IGN. That's why the shells often ignore some
45 // signal when starting child processes. We keep it.
46 //=======================================================================
47 static void SetSignalHandler(Utils_SignalsHandler::TSigHandlerCont& theSigHandlerCont,
50 TSigHandler anOldHandler = signal(theSigId,&Handler);
51 if(anOldHandler == SIG_IGN)
52 signal(theSigId,SIG_IGN);
53 theSigHandlerCont[theSigId] = anOldHandler;
56 static TSigHandler StoreSignalHandler(Utils_SignalsHandler::TSigHandlerCont& theSigHandlerCont,
59 TSigHandler anOldHandler = signal(theSigId,&Handler);
60 signal(theSigId,anOldHandler);
61 if(anOldHandler == SIG_IGN)
62 signal(theSigId,SIG_IGN);
63 theSigHandlerCont[theSigId] = anOldHandler;
67 static void RestoreSigHandler(TSigHandler theSigHandler,
70 signal(theSigId,theSigHandler);
74 //=======================================================================
75 //function : Utils_SignalsHandler
76 //purpose : Constructor
77 //=======================================================================
78 Utils_SignalsHandler::Utils_SignalsHandler()
80 StoreSignalHandler(mySigHandlerCont,SIGHUP); // floating point exception
81 StoreSignalHandler(mySigHandlerCont,SIGFPE); // floating point exception
83 StoreSignalHandler(mySigHandlerCont,SIGINT); // interrupt
84 StoreSignalHandler(mySigHandlerCont,SIGQUIT); // quit
85 StoreSignalHandler(mySigHandlerCont,SIGBUS); // bus error
86 StoreSignalHandler(mySigHandlerCont,SIGILL); // illegal instruction
87 StoreSignalHandler(mySigHandlerCont,SIGTERM); // termination
88 StoreSignalHandler(mySigHandlerCont,SIGSEGV); // segmentation
89 //StoreSignalHandler(mySigHandlerCont,SIGABRT); // abort (ANSI).
90 StoreSignalHandler(mySigHandlerCont,SIGSTKFLT); // stack fault.
94 //=======================================================================
95 //function : Utils_SignalsHandler
96 //purpose : destructor
97 //=======================================================================
98 Utils_SignalsHandler::~Utils_SignalsHandler()
100 TSigHandlerCont::iterator anIter = mySigHandlerCont.begin();
101 TSigHandlerCont::iterator anIterEnd = mySigHandlerCont.end();
102 for(; anIter != anIterEnd; anIter++)
103 RestoreSigHandler(anIter->second,anIter->first);
107 //=======================================================================
108 //function : SetSigHandler
109 //purpose : sets new handler for pointed signal
110 //=======================================================================
111 TSigHandler Utils_SignalsHandler::SetSigHandler(int theSigId,
112 TSigHandler theSigHandler)
114 TSigHandler anOldHandler = signal(theSigId,theSigHandler);
115 if(anOldHandler == SIG_IGN)
116 signal(theSigId,SIG_IGN);
117 mySigHandlerCont[theSigId] = anOldHandler;