mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 03:22:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			435 lines
		
	
	
	
		
			15 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			435 lines
		
	
	
	
		
			15 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
: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.
 | 
						|
 | 
						|
 | 
						|
General rules
 | 
						|
-------------
 | 
						|
 | 
						|
The :func:`signal.signal` function allows to define custom handlers to be
 | 
						|
executed when a signal is received.  A small number of default handlers are
 | 
						|
installed: :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.
 | 
						|
 | 
						|
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).
 | 
						|
 | 
						|
 | 
						|
Execution of Python signal handlers
 | 
						|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
A Python signal handler does not get executed inside the low-level (C) signal
 | 
						|
handler.  Instead, the low-level signal handler sets a flag which tells the
 | 
						|
:term:`virtual machine` to execute the corresponding Python signal handler
 | 
						|
at a later point(for example at the next :term:`bytecode` instruction).
 | 
						|
This has consequences:
 | 
						|
 | 
						|
* It makes little sense to catch synchronous errors like :const:`SIGFPE` or
 | 
						|
  :const:`SIGSEGV`.
 | 
						|
 | 
						|
* A long-running calculation implemented purely in C (such as regular
 | 
						|
  expression matching on a large body of text) may run uninterrupted for an
 | 
						|
  arbitrary amount of time, regardless of any signals received.  The Python
 | 
						|
  signal handlers will be called when the calculation finishes.
 | 
						|
 | 
						|
 | 
						|
.. _signals-and-threads:
 | 
						|
 | 
						|
 | 
						|
Signals and threads
 | 
						|
^^^^^^^^^^^^^^^^^^^
 | 
						|
 | 
						|
Python signal handlers are always executed in the main Python thread,
 | 
						|
even if the signal was received in another thread.  This means that signals
 | 
						|
can't be used as a means of inter-thread communication.  You can use
 | 
						|
the synchronization primitives from the :mod:`threading` module instead.
 | 
						|
 | 
						|
Besides, only the main thread is allowed to set a new signal handler.
 | 
						|
 | 
						|
 | 
						|
Module contents
 | 
						|
---------------
 | 
						|
 | 
						|
The variables defined in the :mod:`signal` module are:
 | 
						|
 | 
						|
 | 
						|
.. data:: 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 :const:`SIGQUIT` is to dump core and exit, while the
 | 
						|
   default action for :const:`SIGCHLD` is to simply ignore it.
 | 
						|
 | 
						|
 | 
						|
.. 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
 | 
						|
   ':c:func:`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:: CTRL_C_EVENT
 | 
						|
 | 
						|
   The signal corresponding to the CTRL+C keystroke event. This signal can
 | 
						|
   only be used with :func:`os.kill`.
 | 
						|
 | 
						|
   Availability: Windows.
 | 
						|
 | 
						|
   .. versionadded:: 3.2
 | 
						|
 | 
						|
 | 
						|
.. data:: CTRL_BREAK_EVENT
 | 
						|
 | 
						|
   The signal corresponding to the CTRL+BREAK keystroke event. This signal can
 | 
						|
   only be used with :func:`os.kill`.
 | 
						|
 | 
						|
   Availability: Windows.
 | 
						|
 | 
						|
   .. versionadded:: 3.2
 | 
						|
 | 
						|
 | 
						|
.. data:: NSIG
 | 
						|
 | 
						|
   One more than the number of the highest signal number.
 | 
						|
 | 
						|
 | 
						|
.. data:: ITIMER_REAL
 | 
						|
 | 
						|
   Decrements interval timer in real time, and delivers :const:`SIGALRM` upon
 | 
						|
   expiration.
 | 
						|
 | 
						|
 | 
						|
.. 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.
 | 
						|
 | 
						|
 | 
						|
.. data:: SIG_BLOCK
 | 
						|
 | 
						|
   A possible value for the *how* parameter to :func:`pthread_sigmask`
 | 
						|
   indicating that signals are to be blocked.
 | 
						|
 | 
						|
   .. versionadded:: 3.3
 | 
						|
 | 
						|
.. data:: SIG_UNBLOCK
 | 
						|
 | 
						|
   A possible value for the *how* parameter to :func:`pthread_sigmask`
 | 
						|
   indicating that signals are to be unblocked.
 | 
						|
 | 
						|
   .. versionadded:: 3.3
 | 
						|
 | 
						|
.. data:: SIG_SETMASK
 | 
						|
 | 
						|
   A possible value for the *how* parameter to :func:`pthread_sigmask`
 | 
						|
   indicating that the signal mask is to be replaced.
 | 
						|
 | 
						|
   .. versionadded:: 3.3
 | 
						|
 | 
						|
 | 
						|
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:`OSError`.
 | 
						|
 | 
						|
   .. versionadded:: 3.3
 | 
						|
      This error used to be a subtype of :exc:`IOError`, which is now an
 | 
						|
      alias of :exc:`OSError`.
 | 
						|
 | 
						|
 | 
						|
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)`.)
 | 
						|
 | 
						|
   See also :func:`sigwait`, :func:`sigwaitinfo`, :func:`sigtimedwait` and
 | 
						|
   :func:`sigpending`.
 | 
						|
 | 
						|
 | 
						|
.. function:: pthread_kill(thread_id, signum)
 | 
						|
 | 
						|
   Send the signal *signum* to the thread *thread_id*, another thread in the
 | 
						|
   same process as the caller.  The target thread can be executing any code
 | 
						|
   (Python or not).  However, if the target thread is executing the Python
 | 
						|
   interpreter, the Python signal handlers will be :ref:`executed by the main
 | 
						|
   thread <signals-and-threads>`.  Therefore, the only point of sending a signal to a particular
 | 
						|
   Python thread would be to force a running system call to fail with
 | 
						|
   :exc:`InterruptedError`.
 | 
						|
 | 
						|
   Use :func:`threading.get_ident()` or the :attr:`~threading.Thread.ident`
 | 
						|
   attribute of :class:`threading.Thread` objects to get a suitable value
 | 
						|
   for *thread_id*.
 | 
						|
 | 
						|
   If *signum* is 0, then no signal is sent, but error checking is still
 | 
						|
   performed; this can be used to check if the target thread is still running.
 | 
						|
 | 
						|
   Availability: Unix (see the man page :manpage:`pthread_kill(3)` for further
 | 
						|
   information).
 | 
						|
 | 
						|
   See also :func:`os.kill`.
 | 
						|
 | 
						|
   .. versionadded:: 3.3
 | 
						|
 | 
						|
 | 
						|
.. function:: pthread_sigmask(how, mask)
 | 
						|
 | 
						|
   Fetch and/or change the signal mask of the calling thread.  The signal mask
 | 
						|
   is the set of signals whose delivery is currently blocked for the caller.
 | 
						|
   Return the old signal mask as a set of signals.
 | 
						|
 | 
						|
   The behavior of the call is dependent on the value of *how*, as follows.
 | 
						|
 | 
						|
   * :data:`SIG_BLOCK`: The set of blocked signals is the union of the current
 | 
						|
     set and the *mask* argument.
 | 
						|
   * :data:`SIG_UNBLOCK`: The signals in *mask* are removed from the current
 | 
						|
     set of blocked signals.  It is permissible to attempt to unblock a
 | 
						|
     signal which is not blocked.
 | 
						|
   * :data:`SIG_SETMASK`: The set of blocked signals is set to the *mask*
 | 
						|
     argument.
 | 
						|
 | 
						|
   *mask* is a set of signal numbers (e.g. {:const:`signal.SIGINT`,
 | 
						|
   :const:`signal.SIGTERM`}). Use ``range(1, signal.NSIG)`` for a full mask
 | 
						|
   including all signals.
 | 
						|
 | 
						|
   For example, ``signal.pthread_sigmask(signal.SIG_BLOCK, [])`` reads the
 | 
						|
   signal mask of the calling thread.
 | 
						|
 | 
						|
   Availability: Unix. See the man page :manpage:`sigprocmask(3)` and
 | 
						|
   :manpage:`pthread_sigmask(3)` for further information.
 | 
						|
 | 
						|
   See also :func:`pause`, :func:`sigpending` and :func:`sigwait`.
 | 
						|
 | 
						|
   .. versionadded:: 3.3
 | 
						|
 | 
						|
 | 
						|
.. function:: setitimer(which, seconds[, interval])
 | 
						|
 | 
						|
   Sets given interval timer (one of :const:`signal.ITIMER_REAL`,
 | 
						|
   :const:`signal.ITIMER_VIRTUAL` or :const:`signal.ITIMER_PROF`) specified
 | 
						|
   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.
 | 
						|
 | 
						|
   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`.
 | 
						|
 | 
						|
   The old values are returned as a tuple: (delay, interval).
 | 
						|
 | 
						|
   Attempting to pass an invalid interval timer will cause an
 | 
						|
   :exc:`ItimerError`.  Availability: Unix.
 | 
						|
 | 
						|
 | 
						|
.. function:: getitimer(which)
 | 
						|
 | 
						|
   Returns current value of a given interval timer specified by *which*.
 | 
						|
   Availability: Unix.
 | 
						|
 | 
						|
 | 
						|
.. function:: set_wakeup_fd(fd)
 | 
						|
 | 
						|
   Set the wakeup file descriptor to *fd*.  When a signal is received, the
 | 
						|
   signal number is written as a single byte into 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.
 | 
						|
 | 
						|
   Use for example ``struct.unpack('%uB' % len(data), data)`` to decode the
 | 
						|
   signal numbers list.
 | 
						|
 | 
						|
   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.
 | 
						|
 | 
						|
 | 
						|
.. function:: siginterrupt(signalnum, flag)
 | 
						|
 | 
						|
   Change system call restart behaviour: if *flag* is :const:`False`, system
 | 
						|
   calls will be restarted when interrupted by signal *signalnum*, otherwise
 | 
						|
   system calls will be interrupted.  Returns nothing.  Availability: Unix (see
 | 
						|
   the man page :manpage:`siginterrupt(3)` for further information).
 | 
						|
 | 
						|
   Note that installing a signal handler with :func:`signal` will reset the
 | 
						|
   restart behaviour to interruptible by implicitly calling
 | 
						|
   :c:func:`siginterrupt` with a true *flag* value for the given signal.
 | 
						|
 | 
						|
 | 
						|
.. 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 :ref:`description in the type hierarchy <frame-objects>` or see the
 | 
						|
   attribute descriptions in the :mod:`inspect` module).
 | 
						|
 | 
						|
   On Windows, :func:`signal` can only be called with :const:`SIGABRT`,
 | 
						|
   :const:`SIGFPE`, :const:`SIGILL`, :const:`SIGINT`, :const:`SIGSEGV`, or
 | 
						|
   :const:`SIGTERM`. A :exc:`ValueError` will be raised in any other case.
 | 
						|
 | 
						|
 | 
						|
.. function:: sigpending()
 | 
						|
 | 
						|
   Examine the set of signals that are pending for delivery to the calling
 | 
						|
   thread (i.e., the signals which have been raised while blocked).  Return the
 | 
						|
   set of the pending signals.
 | 
						|
 | 
						|
   Availability: Unix (see the man page :manpage:`sigpending(2)` for further
 | 
						|
   information).
 | 
						|
 | 
						|
   See also :func:`pause`, :func:`pthread_sigmask` and :func:`sigwait`.
 | 
						|
 | 
						|
   .. versionadded:: 3.3
 | 
						|
 | 
						|
 | 
						|
.. function:: sigwait(sigset)
 | 
						|
 | 
						|
   Suspend execution of the calling thread until the delivery of one of the
 | 
						|
   signals specified in the signal set *sigset*.  The function accepts the signal
 | 
						|
   (removes it from the pending list of signals), and returns the signal number.
 | 
						|
 | 
						|
   Availability: Unix (see the man page :manpage:`sigwait(3)` for further
 | 
						|
   information).
 | 
						|
 | 
						|
   See also :func:`pause`, :func:`pthread_sigmask`, :func:`sigpending`,
 | 
						|
   :func:`sigwaitinfo` and :func:`sigtimedwait`.
 | 
						|
 | 
						|
   .. versionadded:: 3.3
 | 
						|
 | 
						|
 | 
						|
.. function:: sigwaitinfo(sigset)
 | 
						|
 | 
						|
   Suspend execution of the calling thread until the delivery of one of the
 | 
						|
   signals specified in the signal set *sigset*.  The function accepts the
 | 
						|
   signal and removes it from the pending list of signals. If one of the
 | 
						|
   signals in *sigset* is already pending for the calling thread, the function
 | 
						|
   will return immediately with information about that signal. The signal
 | 
						|
   handler is not called for the delivered signal. The function raises an
 | 
						|
   :exc:`InterruptedError` if it is interrupted by a signal that is not in
 | 
						|
   *sigset*.
 | 
						|
 | 
						|
   The return value is an object representing the data contained in the
 | 
						|
   :c:type:`siginfo_t` structure, namely: :attr:`si_signo`, :attr:`si_code`,
 | 
						|
   :attr:`si_errno`, :attr:`si_pid`, :attr:`si_uid`, :attr:`si_status`,
 | 
						|
   :attr:`si_band`.
 | 
						|
 | 
						|
   Availability: Unix (see the man page :manpage:`sigwaitinfo(2)` for further
 | 
						|
   information).
 | 
						|
 | 
						|
   See also :func:`pause`, :func:`sigwait` and :func:`sigtimedwait`.
 | 
						|
 | 
						|
   .. versionadded:: 3.3
 | 
						|
 | 
						|
 | 
						|
.. function:: sigtimedwait(sigset, timeout)
 | 
						|
 | 
						|
   Like :func:`sigwaitinfo`, but takes an additional *timeout* argument
 | 
						|
   specifying a timeout. If *timeout* is specified as :const:`0`, a poll is
 | 
						|
   performed. Returns :const:`None` if a timeout occurs.
 | 
						|
 | 
						|
   Availability: Unix (see the man page :manpage:`sigtimedwait(2)` for further
 | 
						|
   information).
 | 
						|
 | 
						|
   See also :func:`pause`, :func:`sigwait` and :func:`sigwaitinfo`.
 | 
						|
 | 
						|
   .. versionadded:: 3.3
 | 
						|
 | 
						|
 | 
						|
.. _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 OSError("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
 | 
						|
 |