Poco

class SignalHandler

Library: Foundation
Package: Threading
Header: Poco/SignalHandler.h

Description

This helper class simplifies the handling of POSIX signals.

The class provides a signal handler (installed with installHandlers()) that translates certain POSIX signals (SIGILL, SIGBUS, SIGSEGV, SIGSYS) into C++ exceptions.

Internally, a stack of sigjmp_buf structs is maintained for each thread. The constructor pushes a new sigjmp_buf onto the current thread's stack. The destructor pops the sigjmp_buf from the stack.

The poco_throw_on_signal macro creates an instance of SignalHandler on the stack, which results in a new sigjmp_buf being created. The sigjmp_buf is then set-up with sigsetjmp().

The handleSignal() method, which is invoked when a signal arrives, checks if a sigjmp_buf is available for the current thread. If so, siglongjmp() is used to jump out of the signal handler.

Typical usage is as follows:

try
{
     poco_throw_on_signal;
     ...
}
catch (Poco::SignalException&)
{
    ...
}

The best way to deal with a SignalException is to log as much context information as possible, to aid in debugging, and then to exit.

The SignalHandler can be disabled globally by compiling POCO and client code with the POCO_NO_SIGNAL_HANDLER macro defined.

Member Summary

Member Functions: handleSignal, install, jumpBuffer, jumpBufferVec, throwSignalException

Nested Classes

struct JumpBuffer protected

sigjmp_buf cannot be used to instantiate a std::vector, so we provide a wrapper struct. more...

Types

JumpBufferVec protected

typedef std::vector < JumpBuffer > JumpBufferVec;

Constructors

SignalHandler

SignalHandler();

Creates the SignalHandler.

Destructor

~SignalHandler

~SignalHandler();

Destroys the SignalHandler.

Member Functions

install static

static void install();

Installs signal handlers for SIGILL, SIGBUS, SIGSEGV and SIGSYS.

jumpBuffer

sigjmp_buf & jumpBuffer();

Returns the top-most sigjmp_buf for the current thread.

throwSignalException static

static void throwSignalException(
    int sig
);

Throws a SignalException with a textual description of the given signal as argument.

handleSignal protected static

static void handleSignal(
    int sig
);

The actual signal handler.

jumpBufferVec protected static

static JumpBufferVec & jumpBufferVec();

Returns the JumpBufferVec for the current thread.