📄 siginfo.cpp
字号:
// SigInfo.cpp,v 1.4 2004/01/04 08:57:24 jwillemsen Exp
#include "ace/Log_Msg.h"
#include "ace/Reactor.h"
#include "ace/Event_Handler.h"
#include "ace/Signal.h"
#include "ace/streams.h"
#include "ace/OS_NS_unistd.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 (__linux__)
// Listing B code/ch11
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("errno for this signal is %d [%s]\n"),
siginfo->si_errno,
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)
puts ("This requires fork()\n");
#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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -