1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
// $Id: SigInfo.cpp 95533 2012-02-14 22:59:17Z wotte $
#include "ace/Log_Msg.h"
#include "ace/Reactor.h"
#include "ace/Event_Handler.h"
#include "ace/Signal.h"
#include "ace/OS_NS_unistd.h"
#include "ace/OS_NS_string.h"
#if !defined (ACE_LACKS_UNIX_SIGNALS)
// Listing 1 code/ch11
class MySignalHandler : public ACE_Event_Handler
{
public:
MySignalHandler () : ACE_Event_Handler()
{ }
// Listing A code/ch11
int handle_signal (int signum,
siginfo_t * siginfo = 0,
ucontext_t * = 0)
{
ACE_DEBUG ((LM_INFO, ACE_TEXT ("Received signal [%S]\n"),
signum));
if (siginfo == 0)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("No siginfo_t available for ")
ACE_TEXT ("signal [%S]\n"),
signum));
return 0;
}
// Listing A
#if defined (ACE_LINUX)
// Listing B code/ch11
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("errno for this signal is %d [%s]\n"),
siginfo->si_errno,
ACE_OS::strerror (siginfo->si_errno)));
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("signal was sent by process %d")
ACE_TEXT (" / user %d\n"),
siginfo->si_pid,
siginfo->si_uid));
switch (siginfo->si_code)
{
case SI_TIMER:
ACE_DEBUG ((LM_INFO, ACE_TEXT ("Timer expiration\n")));
break;
case SI_USER:
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("Sent by kill, sigsend or raise\n")));
break;
case SI_KERNEL:
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("Sent by kernel\n")));
break;
// ...
};
// Listing B
// Listing C code/ch11
switch (signum)
{
case SIGFPE:
switch (siginfo->si_code)
{
case FPE_INTDIV:
case FPE_FLTDIV:
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("Divide by zero at %@\n"),
siginfo->si_addr));
break;
case FPE_INTOVF:
case FPE_FLTOVF:
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("Numeric overflow at %@\n"),
siginfo->si_addr));
break;
// ...
}
break;
// Listing C
// Listing D code/ch11
case SIGSEGV:
switch (siginfo->si_code)
{
// ...
};
break;
// Listing D
// Listing E code/ch11
case SIGCHLD:
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("A child process has exited\n")));
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("The child consumed %l/%l time\n"),
siginfo->si_utime,
siginfo->si_stime));
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("and exited with value %d\n"),
siginfo->si_status));
break;
// ...
}
// Listing E
#endif /* __linux__ */
return 0;
}
};
// Listing 1
#endif /* ACE_LACKS_UNIX_SIGNALS */
#if !defined (ACE_LACKS_UNIX_SIGNALS)
int ACE_TMAIN (int, ACE_TCHAR *[])
{
#if defined (ACE_LACKS_FORK)
//FUZZ: disable check_for_lack_ACE_OS
ACE_DEBUG ((LM_DEBUG,
"This example requires fork()\n"));
//FUZZ: enable check_for_lack_ACE_OS
#else
// Create a child process so that we can test our
// ability to handle SIGCHLD
// Listing 2 code/ch11
ACE_Sig_Set signalSet;
signalSet.fill_set ();
MySignalHandler h1;
ACE_Reactor::instance ()->register_handler (signalSet, &h1);
pid_t childPid = ACE_OS::fork ();
if (childPid == 0) // This is the parent process.
{
// Exclude B
ACE_OS::sleep (10);
return 100;
// Exclude B
}
ACE_Reactor::instance ()->run_reactor_event_loop ();
// Listing 2
#endif /* ACE_LACKS_FORK */
return 0;
}
#else
int
ACE_TMAIN (int, ACE_TCHAR *[])
{
ACE_DEBUG ((LM_DEBUG,
"This example does not work on this platform.\n"));
return 1;
}
#endif /* !ACE_LACKS_UNIX_SIGNALS */
|