2007-08-15 11:28:01 -03:00
|
|
|
|
|
|
|
:mod:`signal` --- Set handlers for asynchronous events
|
|
|
|
======================================================
|
|
|
|
|
|
|
|
.. module:: signal
|
|
|
|
:synopsis: 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:
|
|
|
|
|
|
|
|
* A handler for a particular signal, once set, remains installed until it is
|
|
|
|
explicitly reset (Python emulates the BSD style interface regardless of the
|
|
|
|
underlying implementation), with the exception of the handler for
|
|
|
|
:const:`SIGCHLD`, which follows the underlying implementation.
|
|
|
|
|
|
|
|
* There is no way to "block" signals temporarily from critical sections (since
|
|
|
|
this is not supported by all Unix flavors).
|
|
|
|
|
|
|
|
* 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 signals arriving during long calculations
|
|
|
|
implemented purely in C (such as regular expression matches on large bodies of
|
|
|
|
text) may be delayed for an arbitrary amount of time.
|
|
|
|
|
|
|
|
* 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. This is
|
|
|
|
dependent on the underlying Unix system's semantics regarding interrupted system
|
|
|
|
calls.
|
|
|
|
|
|
|
|
* Because the C signal handler always returns, it makes little sense to catch
|
|
|
|
synchronous errors like :const:`SIGFPE` or :const:`SIGSEGV`.
|
|
|
|
|
|
|
|
* Python installs a small number of signal handlers by default: :const:`SIGPIPE`
|
|
|
|
is ignored (so write errors on pipes and sockets can be reported as ordinary
|
|
|
|
Python exceptions) and :const:`SIGINT` is translated into a
|
|
|
|
:exc:`KeyboardInterrupt` exception. All of these can be overridden.
|
|
|
|
|
|
|
|
* 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 threads
|
|
|
|
simultaneously is: always perform :func:`signal` operations in the main thread
|
2008-03-24 10:31:16 -03:00
|
|
|
of execution. Any thread can perform an :func:`alarm`, :func:`getsignal`,
|
|
|
|
:func:`pause`, :func:`setitimer` or :func:`getitimer`; 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 :mod:`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
|
|
|
|
inter-thread communication. Use locks instead.
|
2007-08-15 11:28:01 -03:00
|
|
|
|
|
|
|
The variables defined in the :mod:`signal` module are:
|
|
|
|
|
|
|
|
|
|
|
|
.. data:: SIG_DFL
|
|
|
|
|
Merged revisions 67654,67676-67677,67681,67692,67725,67746,67748,67761,67784-67785,67787-67788,67802,67832,67848-67849,67859,67862-67864,67880,67882,67885,67889-67892,67895 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
................
r67654 | georg.brandl | 2008-12-07 16:42:09 -0600 (Sun, 07 Dec 2008) | 2 lines
#4457: rewrite __import__() documentation.
................
r67676 | benjamin.peterson | 2008-12-08 20:03:03 -0600 (Mon, 08 Dec 2008) | 1 line
specify how things are copied
................
r67677 | benjamin.peterson | 2008-12-08 20:05:11 -0600 (Mon, 08 Dec 2008) | 1 line
revert unrelated change to installer script
................
r67681 | jeremy.hylton | 2008-12-09 15:03:10 -0600 (Tue, 09 Dec 2008) | 2 lines
Add simple unittests for Request
................
r67692 | amaury.forgeotdarc | 2008-12-10 18:03:42 -0600 (Wed, 10 Dec 2008) | 2 lines
#1030250: correctly pass the dry_run option to the mkpath() function.
................
r67725 | benjamin.peterson | 2008-12-12 22:02:20 -0600 (Fri, 12 Dec 2008) | 1 line
fix incorrect example
................
r67746 | antoine.pitrou | 2008-12-13 17:12:30 -0600 (Sat, 13 Dec 2008) | 3 lines
Issue #4163: Use unicode-friendly word splitting in the textwrap functions when given an unicode string.
................
r67748 | benjamin.peterson | 2008-12-13 19:46:11 -0600 (Sat, 13 Dec 2008) | 1 line
remove has_key usage
................
r67761 | benjamin.peterson | 2008-12-14 11:26:04 -0600 (Sun, 14 Dec 2008) | 1 line
fix missing bracket
................
r67784 | georg.brandl | 2008-12-15 02:33:58 -0600 (Mon, 15 Dec 2008) | 2 lines
#4446: document "platforms" argument for setup().
................
r67785 | georg.brandl | 2008-12-15 02:36:11 -0600 (Mon, 15 Dec 2008) | 2 lines
#4611: fix typo.
................
r67787 | georg.brandl | 2008-12-15 02:58:59 -0600 (Mon, 15 Dec 2008) | 2 lines
#4578: fix has_key() usage in compiler package.
................
r67788 | georg.brandl | 2008-12-15 03:07:39 -0600 (Mon, 15 Dec 2008) | 2 lines
#4568: remove limitation in varargs callback example.
................
r67802 | amaury.forgeotdarc | 2008-12-15 16:29:14 -0600 (Mon, 15 Dec 2008) | 4 lines
#3632: the "pyo" macro from gdbinit can now run when the GIL is released.
Patch by haypo.
................
r67832 | antoine.pitrou | 2008-12-17 16:46:54 -0600 (Wed, 17 Dec 2008) | 4 lines
Issue #2467: gc.DEBUG_STATS reports invalid elapsed times.
Patch by Neil Schemenauer, very slightly modified.
................
r67848 | benjamin.peterson | 2008-12-18 20:28:56 -0600 (Thu, 18 Dec 2008) | 1 line
fix typo
................
r67849 | benjamin.peterson | 2008-12-18 20:31:35 -0600 (Thu, 18 Dec 2008) | 1 line
_call_method -> _callmethod and _get_value to _getvalue
................
r67859 | amaury.forgeotdarc | 2008-12-19 16:56:48 -0600 (Fri, 19 Dec 2008) | 4 lines
#4700: crtlicense.txt is displayed by the license() command and should be kept ascii-only.
Will port to 3.0
................
r67862 | benjamin.peterson | 2008-12-19 20:48:02 -0600 (Fri, 19 Dec 2008) | 1 line
copy sentence from docstring
................
r67863 | benjamin.peterson | 2008-12-19 20:51:26 -0600 (Fri, 19 Dec 2008) | 1 line
add headings
................
r67864 | benjamin.peterson | 2008-12-19 20:57:19 -0600 (Fri, 19 Dec 2008) | 1 line
beef up docstring
................
r67880 | benjamin.peterson | 2008-12-20 16:49:24 -0600 (Sat, 20 Dec 2008) | 1 line
remove redundant sentence
................
r67882 | benjamin.peterson | 2008-12-20 16:59:49 -0600 (Sat, 20 Dec 2008) | 1 line
add some recent releases to the list
................
r67885 | benjamin.peterson | 2008-12-20 17:48:54 -0600 (Sat, 20 Dec 2008) | 1 line
silence annoying DeprecationWarning
................
r67889 | benjamin.peterson | 2008-12-20 19:04:32 -0600 (Sat, 20 Dec 2008) | 1 line
sphinx.web is long gone
................
r67890 | benjamin.peterson | 2008-12-20 19:12:26 -0600 (Sat, 20 Dec 2008) | 1 line
update readme
................
r67891 | benjamin.peterson | 2008-12-20 19:14:47 -0600 (Sat, 20 Dec 2008) | 1 line
there are way too many places which need to have the current version added
................
r67892 | benjamin.peterson | 2008-12-20 19:29:32 -0600 (Sat, 20 Dec 2008) | 9 lines
Merged revisions 67809 via svnmerge from
svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3
........
r67809 | benjamin.peterson | 2008-12-15 21:54:45 -0600 (Mon, 15 Dec 2008) | 1 line
fix logic error
........
................
r67895 | neal.norwitz | 2008-12-21 08:28:32 -0600 (Sun, 21 Dec 2008) | 2 lines
Add Tarek for work on distutils.
................
2008-12-21 13:01:26 -04:00
|
|
|
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 :const:`SIGQUIT` is to dump core and exit, while the
|
|
|
|
default action for :const:`SIGCHLD` is to simply ignore it.
|
2007-08-15 11:28:01 -03:00
|
|
|
|
|
|
|
|
|
|
|
.. data:: SIG_IGN
|
|
|
|
|
|
|
|
This is another standard signal handler, which will simply ignore the given
|
|
|
|
signal.
|
|
|
|
|
|
|
|
|
|
|
|
.. data:: SIG*
|
|
|
|
|
|
|
|
All the signal numbers are defined symbolically. For example, the hangup signal
|
|
|
|
is defined as :const:`signal.SIGHUP`; the variable names are identical to the
|
|
|
|
names used in C programs, as found in ``<signal.h>``. The Unix man page for
|
|
|
|
':cfunc:`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.
|
|
|
|
|
|
|
|
|
|
|
|
.. data:: NSIG
|
|
|
|
|
|
|
|
One more than the number of the highest signal number.
|
|
|
|
|
2008-03-24 10:31:16 -03:00
|
|
|
|
|
|
|
.. data:: ITIMER_REAL
|
|
|
|
|
2008-04-04 23:47:07 -03:00
|
|
|
Decrements interval timer in real time, and delivers :const:`SIGALRM` upon expiration.
|
2008-03-24 10:31:16 -03:00
|
|
|
|
|
|
|
|
|
|
|
.. data:: ITIMER_VIRTUAL
|
|
|
|
|
|
|
|
Decrements interval timer only when the process is executing, and delivers
|
|
|
|
SIGVTALRM upon expiration.
|
|
|
|
|
|
|
|
|
|
|
|
.. data:: ITIMER_PROF
|
|
|
|
|
|
|
|
Decrements interval timer both when the process executes and when the
|
|
|
|
system is executing on behalf of the process. Coupled with ITIMER_VIRTUAL,
|
|
|
|
this timer is usually used to profile the time spent by the application
|
|
|
|
in user and kernel space. SIGPROF is delivered upon expiration.
|
|
|
|
|
|
|
|
|
|
|
|
The :mod:`signal` module defines one exception:
|
|
|
|
|
|
|
|
.. exception:: ItimerError
|
|
|
|
|
|
|
|
Raised to signal an error from the underlying :func:`setitimer` or
|
|
|
|
:func:`getitimer` implementation. Expect this error if an invalid
|
|
|
|
interval timer or a negative time is passed to :func:`setitimer`.
|
|
|
|
This error is a subtype of :exc:`IOError`.
|
|
|
|
|
|
|
|
|
2007-08-15 11:28:01 -03:00
|
|
|
The :mod:`signal` module defines the following functions:
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: alarm(time)
|
|
|
|
|
|
|
|
If *time* is non-zero, this function requests that a :const:`SIGALRM` signal be
|
|
|
|
sent to the process in *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 *time* is zero, no alarm is scheduled, and any scheduled alarm is
|
|
|
|
canceled. If the return value is zero, no alarm is currently scheduled. (See
|
|
|
|
the Unix man page :manpage:`alarm(2)`.) Availability: Unix.
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: getsignal(signalnum)
|
|
|
|
|
|
|
|
Return the current signal handler for the signal *signalnum*. The returned value
|
|
|
|
may be a callable Python object, or one of the special values
|
|
|
|
:const:`signal.SIG_IGN`, :const:`signal.SIG_DFL` or :const:`None`. Here,
|
|
|
|
:const:`signal.SIG_IGN` means that the signal was previously ignored,
|
|
|
|
:const:`signal.SIG_DFL` means that the default way of handling the signal was
|
|
|
|
previously in use, and ``None`` means that the previous signal handler was not
|
|
|
|
installed from Python.
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: 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)`.)
|
|
|
|
|
|
|
|
|
2008-03-24 10:31:16 -03:00
|
|
|
.. function:: setitimer(which, seconds[, interval])
|
|
|
|
|
2008-04-04 23:42:20 -03:00
|
|
|
Sets given interval timer (one of :const:`signal.ITIMER_REAL`,
|
|
|
|
:const:`signal.ITIMER_VIRTUAL` or :const:`signal.ITIMER_PROF`) specified
|
2008-03-24 10:31:16 -03:00
|
|
|
by *which* to fire after *seconds* (float is accepted, different from
|
|
|
|
:func:`alarm`) and after that every *interval* seconds. The interval
|
|
|
|
timer specified by *which* can be cleared by setting seconds to zero.
|
|
|
|
|
2008-04-04 23:47:07 -03:00
|
|
|
When an interval timer fires, a signal is sent to the process.
|
|
|
|
The signal sent is dependent on the timer being used;
|
|
|
|
:const:`signal.ITIMER_REAL` will deliver :const:`SIGALRM`,
|
|
|
|
:const:`signal.ITIMER_VIRTUAL` sends :const:`SIGVTALRM`,
|
|
|
|
and :const:`signal.ITIMER_PROF` will deliver :const:`SIGPROF`.
|
|
|
|
|
2008-03-24 10:31:16 -03:00
|
|
|
The old values are returned as a tuple: (delay, interval).
|
|
|
|
|
|
|
|
Attempting to pass an invalid interval timer will cause a
|
|
|
|
:exc:`ItimerError`.
|
|
|
|
|
|
|
|
.. versionadded:: 2.6
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: getitimer(which)
|
|
|
|
|
2008-04-04 23:47:07 -03:00
|
|
|
Returns current value of a given interval timer specified by *which*.
|
2008-03-24 10:31:16 -03:00
|
|
|
|
|
|
|
.. versionadded:: 2.6
|
|
|
|
|
|
|
|
|
2007-12-19 15:41:06 -04:00
|
|
|
.. function:: set_wakeup_fd(fd)
|
|
|
|
|
|
|
|
Set the wakeup fd to *fd*. When a signal is received, a ``'\0'`` byte is
|
|
|
|
written to the fd. This can be used by a library to wakeup a poll or select
|
|
|
|
call, allowing the signal to be fully processed.
|
|
|
|
|
|
|
|
The old wakeup fd is returned. *fd* must be non-blocking. It is up to the
|
|
|
|
library to remove any bytes before calling poll or select again.
|
|
|
|
|
|
|
|
When threads are enabled, this function can only be called from the main thread;
|
|
|
|
attempting to call it from other threads will cause a :exc:`ValueError`
|
|
|
|
exception to be raised.
|
|
|
|
|
|
|
|
|
2008-02-23 11:07:35 -04:00
|
|
|
.. function:: siginterrupt(signalnum, flag)
|
|
|
|
|
|
|
|
Change system call restart behaviour: if *flag* is :const:`False`, system calls
|
2008-03-03 21:30:10 -04:00
|
|
|
will be restarted when interrupted by signal *signalnum*, otherwise system calls will
|
2008-09-13 14:41:16 -03:00
|
|
|
be interrupted. Returns nothing. Availability: Unix (see the man page
|
2008-02-23 11:07:35 -04:00
|
|
|
:manpage:`siginterrupt(3)` for further information).
|
|
|
|
|
|
|
|
Note that installing a signal handler with :func:`signal` will reset the restart
|
2008-03-03 21:30:10 -04:00
|
|
|
behaviour to interruptible by implicitly calling :cfunc:`siginterrupt` with a true *flag*
|
2008-02-23 11:07:35 -04:00
|
|
|
value for the given signal.
|
|
|
|
|
|
|
|
.. versionadded:: 2.6
|
|
|
|
|
|
|
|
|
2007-08-15 11:28:01 -03:00
|
|
|
.. function:: signal(signalnum, handler)
|
|
|
|
|
|
|
|
Set the handler for signal *signalnum* to the function *handler*. *handler* can
|
|
|
|
be a callable Python object taking two arguments (see below), or one of the
|
|
|
|
special values :const:`signal.SIG_IGN` or :const:`signal.SIG_DFL`. The previous
|
|
|
|
signal handler will be returned (see the description of :func:`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 :exc:`ValueError`
|
|
|
|
exception to be raised.
|
|
|
|
|
|
|
|
The *handler* is called with two arguments: the signal number and the current
|
|
|
|
stack frame (``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 :mod:`inspect` module).
|
|
|
|
|
|
|
|
|
|
|
|
.. _signal-example:
|
|
|
|
|
|
|
|
Example
|
|
|
|
-------
|
|
|
|
|
|
|
|
Here is a minimal example program. It uses the :func:`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
|
|
|
|
:func:`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. ::
|
|
|
|
|
|
|
|
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 alarm
|
|
|
|
signal.signal(signal.SIGALRM, handler)
|
|
|
|
signal.alarm(5)
|
|
|
|
|
|
|
|
# This open() may hang indefinitely
|
|
|
|
fd = os.open('/dev/ttyS0', os.O_RDWR)
|
|
|
|
|
|
|
|
signal.alarm(0) # Disable the alarm
|
|
|
|
|