mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +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
 | |
| 
 | 
