cinap_lenrekadd hg and python4bb9e2215 years agoHistory
174 lines · 7.0 KB · TeX
RawDownload
\section{\module{signal} ---         Set handlers for asynchronous events} \declaremodule{builtin}{signal}\modulesynopsis{Set handlers for asynchronous events.}  This module provides mechanisms to use signal handlers in Python.Some general rules for working with signals and their handlers: \begin{itemize} \itemA handler for a particular signal, once set, remains installed untilit is explicitly reset (Python emulates the BSD style interfaceregardless of the underlying implementation), with the exception ofthe handler for \constant{SIGCHLD}, which follows the underlyingimplementation. \itemThere is no way to ``block'' signals temporarily from criticalsections (since this is not supported by all \UNIX{} flavors). \itemAlthough Python signal handlers are called asynchronously as far asthe Python user is concerned, they can only occur between the``atomic'' instructions of the Python interpreter.  This means thatsignals arriving during long calculations implemented purely in C(such as regular expression matches on large bodies of text) may bedelayed for an arbitrary amount of time. \itemWhen a signal arrives during an I/O operation, it is possible that theI/O operation raises an exception after the signal handler returns.This is dependent on the underlying \UNIX{} system's semantics regardinginterrupted system calls. \itemBecause the \C{} signal handler always returns, it makes little sense tocatch synchronous errors like \constant{SIGFPE} or \constant{SIGSEGV}. \itemPython installs a small number of signal handlers by default:\constant{SIGPIPE} is ignored (so write errors on pipes and sockets can bereported as ordinary Python exceptions) and \constant{SIGINT} is translatedinto a \exception{KeyboardInterrupt} exception.  All of these can beoverridden. \itemSome care must be taken if both signals and threads are used in thesame program.  The fundamental thing to remember in using signals andthreads simultaneously is:\ always perform \function{signal()} operationsin the main thread of execution.  Any thread can perform an\function{alarm()}, \function{getsignal()}, or \function{pause()};only the main thread can set a new signal handler, and the main threadwill be the only one to receive signals (this is enforced by thePython \module{signal} module, even if the underlying threadimplementation supports sending signals to individual threads).  Thismeans that signals can't be used as a means of inter-threadcommunication.  Use locks instead. \end{itemize} The variables defined in the \module{signal} module are: \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  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.\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  hangup signal is defined as \constant{signal.SIGHUP}; the variable names  are identical to the names used in C programs, as found in  \code{<signal.h>}.  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}).  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} \begin{datadesc}{NSIG}  One more than the number of the highest signal number.\end{datadesc} The \module{signal} module defines the following functions: \begin{funcdesc}{alarm}{time}  If \var{time} is non-zero, this function requests that a  \constant{SIGALRM} signal be sent to the process in \var{time} seconds.  Any previously scheduled alarm is canceled (only one alarm can  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 is 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  is zero, no alarm is currently scheduled.  (See the \UNIX{} man page  \manpage{alarm}{2}.)  Availability: \UNIX.\end{funcdesc} \begin{funcdesc}{getsignal}{signalnum}  Return the current signal handler for the signal \var{signalnum}.  The returned value may be a callable Python object, or one of the  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.\end{funcdesc} \begin{funcdesc}{pause}{}  Cause the process to sleep until a signal is received; the  appropriate handler will then be called.  Returns nothing.  Not on  Windows. (See the \UNIX{} man page \manpage{signal}{2}.)\end{funcdesc} \begin{funcdesc}{signal}{signalnum, handler}  Set the handler for signal \var{signalnum} to the function  \var{handler}.  \var{handler} can be a callable Python object  taking two arguments (see below), or  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}.)   When threads are enabled, this function can only be called from the  main thread; attempting to call it from other threads will cause a  \exception{ValueError} exception to be raised.   The \var{handler} is called with two arguments: the signal number  and the current stack frame (\code{None} or a frame object;  for a description of frame objects, see the reference manual section  on the standard type hierarchy or see the attribute descriptions in  the \refmodule{inspect} module).\end{funcdesc} \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 isuseful if the file is for a serial device that may not be turned on,which would normally cause the \function{os.open()} to hangindefinitely.  The solution is to set a 5-second alarm before openingthe file; if the operation takes too long, the alarm signal will besent, and the handler raises an exception. \begin{verbatim}import signal, os 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 alarmsignal.signal(signal.SIGALRM, handler)signal.alarm(5) # This open() may hang indefinitelyfd = os.open('/dev/ttyS0', os.O_RDWR)   signal.alarm(0)          # Disable the alarm\end{verbatim}