libsignal.tex 6.98 KB
Newer Older
Fred Drake's avatar
Fred Drake committed
1 2
\section{\module{signal} ---
         Set handlers for asynchronous events.}
3 4 5 6
\declaremodule{builtin}{signal}


\modulesynopsis{Set handlers for asynchronous events.}
Guido van Rossum's avatar
Guido van Rossum committed
7

8
This module provides mechanisms to use signal handlers in Python.
9
Some general rules for working with signals and their handlers:
10 11 12 13 14

\begin{itemize}

\item
A handler for a particular signal, once set, remains installed until
15 16
it is explicitly reset (i.e. Python emulates the BSD style interface
regardless of the underlying implementation), with the exception of
17
the handler for \constant{SIGCHLD}, which follows the underlying
18
implementation.
19 20 21

\item
There is no way to ``block'' signals temporarily from critical
22
sections (since this is not supported by all \UNIX{} flavors).
23 24 25 26 27

\item
Although Python signal handlers are called asynchronously as far as
the Python user is concerned, they can only occur between the
``atomic'' instructions of the Python interpreter.  This means that
28
signals arriving during long calculations implemented purely in \C{}
29
(e.g.\ regular expression matches on large bodies of text) may be
30
delayed for an arbitrary amount of time.
31 32 33 34

\item
When a signal arrives during an I/O operation, it is possible that the
I/O operation raises an exception after the signal handler returns.
35
This is dependent on the underlying \UNIX{} system's semantics regarding
36 37 38
interrupted system calls.

\item
39 40
Because the \C{} signal handler always returns, it makes little sense to
catch synchronous errors like \constant{SIGFPE} or \constant{SIGSEGV}.
41 42 43

\item
Python installs a small number of signal handlers by default:
44 45 46
\constant{SIGPIPE} is ignored (so write errors on pipes and sockets can be
reported as ordinary Python exceptions), \constant{SIGINT} is translated
into a \exception{KeyboardInterrupt} exception, and \constant{SIGTERM} is
47 48 49 50 51 52 53
caught so that necessary cleanup (especially \code{sys.exitfunc}) can
be performed before actually terminating.  All of these can be
overridden.

\item
Some care must be taken if both signals and threads are used in the
same program.  The fundamental thing to remember in using signals and
54
threads simultaneously is:\ always perform \function{signal()} operations
55
in the main thread of execution.  Any thread can perform an
56 57 58 59 60 61 62
\function{alarm()}, \function{getsignal()}, or \function{pause()};
only the main thread can set a new signal handler, and the main thread
will be the only one to receive signals (this is enforced by the
Python \module{signal} module, even if the underlying thread
implementation supports sending signals to individual threads).  This
means that signals can't be used as a means of interthread
communication.  Use locks instead.
63 64

\end{itemize}
Guido van Rossum's avatar
Guido van Rossum committed
65

66
The variables defined in the \module{signal} module are:
Guido van Rossum's avatar
Guido van Rossum committed
67 68 69 70

\begin{datadesc}{SIG_DFL}
  This is one of two standard signal handling options; it will simply
  perform the default function for the signal.  For example, on most
71 72 73
  systems the default action for \constant{SIGQUIT} is to dump core
  and exit, while the default action for \constant{SIGCLD} is to
  simply ignore it.
Guido van Rossum's avatar
Guido van Rossum committed
74 75 76 77 78 79 80 81 82
\end{datadesc}

\begin{datadesc}{SIG_IGN}
  This is another standard signal handler, which will simply ignore
  the given signal.
\end{datadesc}

\begin{datadesc}{SIG*}
  All the signal numbers are defined symbolically.  For example, the
83
  hangup signal is defined as \constant{signal.SIGHUP}; the variable names
Guido van Rossum's avatar
Guido van Rossum committed
84
  are identical to the names used in C programs, as found in
85
  \code{<signal.h>}.
86 87 88
  The \UNIX{} man page for `\cfunction{signal()}' lists the existing
  signals (on some systems this is \manpage{signal}{2}, on others the
  list is in \manpage{signal}{7}).
Guido van Rossum's avatar
Guido van Rossum committed
89 90 91 92
  Note that not all systems define the same set of signal names; only
  those names defined by the system are defined by this module.
\end{datadesc}

93 94 95 96
\begin{datadesc}{NSIG}
  One more than the number of the highest signal number.
\end{datadesc}

97
The \module{signal} module defines the following functions:
Guido van Rossum's avatar
Guido van Rossum committed
98 99 100

\begin{funcdesc}{alarm}{time}
  If \var{time} is non-zero, this function requests that a
101
  \constant{SIGALRM} signal be sent to the process in \var{time} seconds.
102
  Any previously scheduled alarm is canceled (i.e.\ only one alarm can
Guido van Rossum's avatar
Guido van Rossum committed
103 104 105 106 107
  be scheduled at any time).  The returned value is then the number of
  seconds before any previously set alarm was to have been delivered.
  If \var{time} is zero, no alarm id scheduled, and any scheduled
  alarm is canceled.  The return value is the number of seconds
  remaining before a previously scheduled alarm.  If the return value
108
  is zero, no alarm is currently scheduled.  (See the \UNIX{} man page
109
  \manpage{alarm}{2}.)
Guido van Rossum's avatar
Guido van Rossum committed
110 111 112
\end{funcdesc}

\begin{funcdesc}{getsignal}{signalnum}
113
  Return the current signal handler for the signal \var{signalnum}.
Guido van Rossum's avatar
Guido van Rossum committed
114
  The returned value may be a callable Python object, or one of the
115 116 117 118 119 120
  special values \constant{signal.SIG_IGN}, \constant{signal.SIG_DFL} or
  \constant{None}.  Here, \constant{signal.SIG_IGN} means that the
  signal was previously ignored, \constant{signal.SIG_DFL} means that the
  default way of handling the signal was previously in use, and
  \code{None} means that the previous signal handler was not installed
  from Python.
Guido van Rossum's avatar
Guido van Rossum committed
121 122 123
\end{funcdesc}

\begin{funcdesc}{pause}{}
124
  Cause the process to sleep until a signal is received; the
Guido van Rossum's avatar
Guido van Rossum committed
125
  appropriate handler will then be called.  Returns nothing.  (See the
126
  \UNIX{} man page \manpage{signal}{2}.)
Guido van Rossum's avatar
Guido van Rossum committed
127 128
\end{funcdesc}

129
\begin{funcdesc}{signal}{signalnum, handler}
130
  Set the handler for signal \var{signalnum} to the function
131 132
  \var{handler}.  \var{handler} can be a callable Python object
  taking two arguments (see below), or
133 134 135 136
  one of the special values \constant{signal.SIG_IGN} or
  \constant{signal.SIG_DFL}.  The previous signal handler will be returned
  (see the description of \function{getsignal()} above).  (See the
  \UNIX{} man page \manpage{signal}{2}.)
Guido van Rossum's avatar
Guido van Rossum committed
137

138
  When threads are enabled, this function can only be called from the
Guido van Rossum's avatar
Guido van Rossum committed
139
  main thread; attempting to call it from other threads will cause a
140
  \exception{ValueError} exception to be raised.
141 142 143 144 145

  The \var{handler} is called with two arguments: the signal number
  and the current stack frame (\code{None} or a frame object; see the
  reference manual for a description of frame objects).
\obindex{frame}
Guido van Rossum's avatar
Guido van Rossum committed
146
\end{funcdesc}
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174

\subsection{Example}
\nodename{Signal Example}

Here is a minimal example program. It uses the \function{alarm()}
function to limit the time spent waiting to open a file; this is
useful if the file is for a serial device that may not be turned on,
which would normally cause the \function{os.open()} to hang
indefinitely.  The solution is to set a 5-second alarm before opening
the file; if the operation takes too long, the alarm signal will be
sent, and the handler raises an exception.

\begin{verbatim}
import signal, os, FCNTL

def handler(signum, frame):
    print 'Signal handler called with signal', signum
    raise IOError, "Couldn't open device!"

# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)

# This open() may hang indefinitely
fd = os.open('/dev/ttyS0', FCNTL.O_RDWR)  

signal.alarm(0)          # Disable the alarm
\end{verbatim}