17db96d56Sopenharmony_ci:mod:`signal` --- Set handlers for asynchronous events
27db96d56Sopenharmony_ci======================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: signal
57db96d56Sopenharmony_ci   :synopsis: Set handlers for asynchronous events.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci**Source code:** :source:`Lib/signal.py`
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci--------------
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ciThis module provides mechanisms to use signal handlers in Python.
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciGeneral rules
157db96d56Sopenharmony_ci-------------
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ciThe :func:`signal.signal` function allows defining custom handlers to be
187db96d56Sopenharmony_ciexecuted when a signal is received.  A small number of default handlers are
197db96d56Sopenharmony_ciinstalled: :const:`SIGPIPE` is ignored (so write errors on pipes and sockets
207db96d56Sopenharmony_cican be reported as ordinary Python exceptions) and :const:`SIGINT` is
217db96d56Sopenharmony_citranslated into a :exc:`KeyboardInterrupt` exception if the parent process
227db96d56Sopenharmony_cihas not changed it.
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ciA handler for a particular signal, once set, remains installed until it is
257db96d56Sopenharmony_ciexplicitly reset (Python emulates the BSD style interface regardless of the
267db96d56Sopenharmony_ciunderlying implementation), with the exception of the handler for
277db96d56Sopenharmony_ci:const:`SIGCHLD`, which follows the underlying implementation.
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ciOn WebAssembly platforms ``wasm32-emscripten`` and ``wasm32-wasi``, signals
307db96d56Sopenharmony_ciare emulated and therefore behave differently. Several functions and signals
317db96d56Sopenharmony_ciare not available on these platforms.
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ciExecution of Python signal handlers
347db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ciA Python signal handler does not get executed inside the low-level (C) signal
377db96d56Sopenharmony_cihandler.  Instead, the low-level signal handler sets a flag which tells the
387db96d56Sopenharmony_ci:term:`virtual machine` to execute the corresponding Python signal handler
397db96d56Sopenharmony_ciat a later point(for example at the next :term:`bytecode` instruction).
407db96d56Sopenharmony_ciThis has consequences:
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci* It makes little sense to catch synchronous errors like :const:`SIGFPE` or
437db96d56Sopenharmony_ci  :const:`SIGSEGV` that are caused by an invalid operation in C code.  Python
447db96d56Sopenharmony_ci  will return from the signal handler to the C code, which is likely to raise
457db96d56Sopenharmony_ci  the same signal again, causing Python to apparently hang.  From Python 3.3
467db96d56Sopenharmony_ci  onwards, you can use the :mod:`faulthandler` module to report on synchronous
477db96d56Sopenharmony_ci  errors.
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci* A long-running calculation implemented purely in C (such as regular
507db96d56Sopenharmony_ci  expression matching on a large body of text) may run uninterrupted for an
517db96d56Sopenharmony_ci  arbitrary amount of time, regardless of any signals received.  The Python
527db96d56Sopenharmony_ci  signal handlers will be called when the calculation finishes.
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci* If the handler raises an exception, it will be raised "out of thin air" in
557db96d56Sopenharmony_ci  the main thread. See the :ref:`note below <handlers-and-exceptions>` for a
567db96d56Sopenharmony_ci  discussion.
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci.. _signals-and-threads:
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ciSignals and threads
627db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ciPython signal handlers are always executed in the main Python thread of the main interpreter,
657db96d56Sopenharmony_cieven if the signal was received in another thread.  This means that signals
667db96d56Sopenharmony_cican't be used as a means of inter-thread communication.  You can use
677db96d56Sopenharmony_cithe synchronization primitives from the :mod:`threading` module instead.
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ciBesides, only the main thread of the main interpreter is allowed to set a new signal handler.
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ciModule contents
737db96d56Sopenharmony_ci---------------
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci.. versionchanged:: 3.5
767db96d56Sopenharmony_ci   signal (SIG*), handler (:const:`SIG_DFL`, :const:`SIG_IGN`) and sigmask
777db96d56Sopenharmony_ci   (:const:`SIG_BLOCK`, :const:`SIG_UNBLOCK`, :const:`SIG_SETMASK`)
787db96d56Sopenharmony_ci   related constants listed below were turned into
797db96d56Sopenharmony_ci   :class:`enums <enum.IntEnum>` (:class:`Signals`, :class:`Handlers` and :class:`Sigmasks` respectively).
807db96d56Sopenharmony_ci   :func:`getsignal`, :func:`pthread_sigmask`, :func:`sigpending` and
817db96d56Sopenharmony_ci   :func:`sigwait` functions return human-readable
827db96d56Sopenharmony_ci   :class:`enums <enum.IntEnum>` as :class:`Signals` objects.
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ciThe signal module defines three enums:
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci.. class:: Signals
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci   :class:`enum.IntEnum` collection of SIG* constants and the CTRL_* constants.
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci   .. versionadded:: 3.5
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ci.. class:: Handlers
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci   :class:`enum.IntEnum` collection the constants :const:`SIG_DFL` and :const:`SIG_IGN`.
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci   .. versionadded:: 3.5
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci.. class:: Sigmasks
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci   :class:`enum.IntEnum` collection the constants :const:`SIG_BLOCK`, :const:`SIG_UNBLOCK` and :const:`SIG_SETMASK`.
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci   .. availability:: Unix.
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci      See the man page :manpage:`sigprocmask(2)` and
1067db96d56Sopenharmony_ci      :manpage:`pthread_sigmask(3)` for further information.
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci   .. versionadded:: 3.5
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ciThe variables defined in the :mod:`signal` module are:
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci.. data:: SIG_DFL
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci   This is one of two standard signal handling options; it will simply perform
1177db96d56Sopenharmony_ci   the default function for the signal.  For example, on most systems the
1187db96d56Sopenharmony_ci   default action for :const:`SIGQUIT` is to dump core and exit, while the
1197db96d56Sopenharmony_ci   default action for :const:`SIGCHLD` is to simply ignore it.
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci.. data:: SIG_IGN
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci   This is another standard signal handler, which will simply ignore the given
1257db96d56Sopenharmony_ci   signal.
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci.. data:: SIGABRT
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci   Abort signal from :manpage:`abort(3)`.
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci.. data:: SIGALRM
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci   Timer signal from :manpage:`alarm(2)`.
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci   .. availability:: Unix.
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci.. data:: SIGBREAK
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci   Interrupt from keyboard (CTRL + BREAK).
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci   .. availability:: Windows.
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci.. data:: SIGBUS
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci   Bus error (bad memory access).
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci   .. availability:: Unix.
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci.. data:: SIGCHLD
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci   Child process stopped or terminated.
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci   .. availability:: Unix.
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci.. data:: SIGCLD
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci   Alias to :data:`SIGCHLD`.
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci.. data:: SIGCONT
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci   Continue the process if it is currently stopped
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci   .. availability:: Unix.
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci.. data:: SIGFPE
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci   Floating-point exception. For example, division by zero.
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci   .. seealso::
1717db96d56Sopenharmony_ci      :exc:`ZeroDivisionError` is raised when the second argument of a division
1727db96d56Sopenharmony_ci      or modulo operation is zero.
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci.. data:: SIGHUP
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci   Hangup detected on controlling terminal or death of controlling process.
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ci   .. availability:: Unix.
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci.. data:: SIGILL
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci   Illegal instruction.
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci.. data:: SIGINT
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci   Interrupt from keyboard (CTRL + C).
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci   Default action is to raise :exc:`KeyboardInterrupt`.
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ci.. data:: SIGKILL
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci   Kill signal.
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci   It cannot be caught, blocked, or ignored.
1957db96d56Sopenharmony_ci
1967db96d56Sopenharmony_ci   .. availability:: Unix.
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci.. data:: SIGPIPE
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci   Broken pipe: write to pipe with no readers.
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci   Default action is to ignore the signal.
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci   .. availability:: Unix.
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci.. data:: SIGSEGV
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci   Segmentation fault: invalid memory reference.
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci.. data:: SIGSTKFLT
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci    Stack fault on coprocessor. The Linux kernel does not raise this signal: it
2137db96d56Sopenharmony_ci    can only be raised in user space.
2147db96d56Sopenharmony_ci
2157db96d56Sopenharmony_ci   .. availability:: Linux.
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci      On architectures where the signal is available. See
2187db96d56Sopenharmony_ci      the man page :manpage:`signal(7)` for further information.
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci   .. versionadded:: 3.11
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci.. data:: SIGTERM
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci   Termination signal.
2257db96d56Sopenharmony_ci
2267db96d56Sopenharmony_ci.. data:: SIGUSR1
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci   User-defined signal 1.
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci   .. availability:: Unix.
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci.. data:: SIGUSR2
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci   User-defined signal 2.
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci   .. availability:: Unix.
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci.. data:: SIGWINCH
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci   Window resize signal.
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci   .. availability:: Unix.
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci.. data:: SIG*
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ci   All the signal numbers are defined symbolically.  For example, the hangup signal
2477db96d56Sopenharmony_ci   is defined as :const:`signal.SIGHUP`; the variable names are identical to the
2487db96d56Sopenharmony_ci   names used in C programs, as found in ``<signal.h>``.  The Unix man page for
2497db96d56Sopenharmony_ci   ':c:func:`signal`' lists the existing signals (on some systems this is
2507db96d56Sopenharmony_ci   :manpage:`signal(2)`, on others the list is in :manpage:`signal(7)`). Note that
2517db96d56Sopenharmony_ci   not all systems define the same set of signal names; only those names defined by
2527db96d56Sopenharmony_ci   the system are defined by this module.
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci
2557db96d56Sopenharmony_ci.. data:: CTRL_C_EVENT
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci   The signal corresponding to the :kbd:`Ctrl+C` keystroke event. This signal can
2587db96d56Sopenharmony_ci   only be used with :func:`os.kill`.
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci   .. availability:: Windows.
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ci   .. versionadded:: 3.2
2637db96d56Sopenharmony_ci
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci.. data:: CTRL_BREAK_EVENT
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ci   The signal corresponding to the :kbd:`Ctrl+Break` keystroke event. This signal can
2687db96d56Sopenharmony_ci   only be used with :func:`os.kill`.
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci   .. availability:: Windows.
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci   .. versionadded:: 3.2
2737db96d56Sopenharmony_ci
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci.. data:: NSIG
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ci   One more than the number of the highest signal number.
2787db96d56Sopenharmony_ci   Use :func:`valid_signals` to get valid signal numbers.
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci.. data:: ITIMER_REAL
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci   Decrements interval timer in real time, and delivers :const:`SIGALRM` upon
2847db96d56Sopenharmony_ci   expiration.
2857db96d56Sopenharmony_ci
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci.. data:: ITIMER_VIRTUAL
2887db96d56Sopenharmony_ci
2897db96d56Sopenharmony_ci   Decrements interval timer only when the process is executing, and delivers
2907db96d56Sopenharmony_ci   SIGVTALRM upon expiration.
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_ci.. data:: ITIMER_PROF
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ci   Decrements interval timer both when the process executes and when the
2967db96d56Sopenharmony_ci   system is executing on behalf of the process. Coupled with ITIMER_VIRTUAL,
2977db96d56Sopenharmony_ci   this timer is usually used to profile the time spent by the application
2987db96d56Sopenharmony_ci   in user and kernel space. SIGPROF is delivered upon expiration.
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci.. data:: SIG_BLOCK
3027db96d56Sopenharmony_ci
3037db96d56Sopenharmony_ci   A possible value for the *how* parameter to :func:`pthread_sigmask`
3047db96d56Sopenharmony_ci   indicating that signals are to be blocked.
3057db96d56Sopenharmony_ci
3067db96d56Sopenharmony_ci   .. versionadded:: 3.3
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci.. data:: SIG_UNBLOCK
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ci   A possible value for the *how* parameter to :func:`pthread_sigmask`
3117db96d56Sopenharmony_ci   indicating that signals are to be unblocked.
3127db96d56Sopenharmony_ci
3137db96d56Sopenharmony_ci   .. versionadded:: 3.3
3147db96d56Sopenharmony_ci
3157db96d56Sopenharmony_ci.. data:: SIG_SETMASK
3167db96d56Sopenharmony_ci
3177db96d56Sopenharmony_ci   A possible value for the *how* parameter to :func:`pthread_sigmask`
3187db96d56Sopenharmony_ci   indicating that the signal mask is to be replaced.
3197db96d56Sopenharmony_ci
3207db96d56Sopenharmony_ci   .. versionadded:: 3.3
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ciThe :mod:`signal` module defines one exception:
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_ci.. exception:: ItimerError
3267db96d56Sopenharmony_ci
3277db96d56Sopenharmony_ci   Raised to signal an error from the underlying :func:`setitimer` or
3287db96d56Sopenharmony_ci   :func:`getitimer` implementation. Expect this error if an invalid
3297db96d56Sopenharmony_ci   interval timer or a negative time is passed to :func:`setitimer`.
3307db96d56Sopenharmony_ci   This error is a subtype of :exc:`OSError`.
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ci   .. versionadded:: 3.3
3337db96d56Sopenharmony_ci      This error used to be a subtype of :exc:`IOError`, which is now an
3347db96d56Sopenharmony_ci      alias of :exc:`OSError`.
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ciThe :mod:`signal` module defines the following functions:
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci.. function:: alarm(time)
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci   If *time* is non-zero, this function requests that a :const:`SIGALRM` signal be
3437db96d56Sopenharmony_ci   sent to the process in *time* seconds. Any previously scheduled alarm is
3447db96d56Sopenharmony_ci   canceled (only one alarm can be scheduled at any time).  The returned value is
3457db96d56Sopenharmony_ci   then the number of seconds before any previously set alarm was to have been
3467db96d56Sopenharmony_ci   delivered. If *time* is zero, no alarm is scheduled, and any scheduled alarm is
3477db96d56Sopenharmony_ci   canceled.  If the return value is zero, no alarm is currently scheduled.
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci   .. availability:: Unix.
3507db96d56Sopenharmony_ci
3517db96d56Sopenharmony_ci      See the man page :manpage:`alarm(2)` for further information.
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci.. function:: getsignal(signalnum)
3557db96d56Sopenharmony_ci
3567db96d56Sopenharmony_ci   Return the current signal handler for the signal *signalnum*. The returned value
3577db96d56Sopenharmony_ci   may be a callable Python object, or one of the special values
3587db96d56Sopenharmony_ci   :const:`signal.SIG_IGN`, :const:`signal.SIG_DFL` or :const:`None`.  Here,
3597db96d56Sopenharmony_ci   :const:`signal.SIG_IGN` means that the signal was previously ignored,
3607db96d56Sopenharmony_ci   :const:`signal.SIG_DFL` means that the default way of handling the signal was
3617db96d56Sopenharmony_ci   previously in use, and ``None`` means that the previous signal handler was not
3627db96d56Sopenharmony_ci   installed from Python.
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ci
3657db96d56Sopenharmony_ci.. function:: strsignal(signalnum)
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci   Returns the description of signal *signalnum*, such as "Interrupt"
3687db96d56Sopenharmony_ci   for :const:`SIGINT`. Returns :const:`None` if *signalnum* has no
3697db96d56Sopenharmony_ci   description. Raises :exc:`ValueError` if *signalnum* is invalid.
3707db96d56Sopenharmony_ci
3717db96d56Sopenharmony_ci   .. versionadded:: 3.8
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ci
3747db96d56Sopenharmony_ci.. function:: valid_signals()
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci   Return the set of valid signal numbers on this platform.  This can be
3777db96d56Sopenharmony_ci   less than ``range(1, NSIG)`` if some signals are reserved by the system
3787db96d56Sopenharmony_ci   for internal use.
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_ci   .. versionadded:: 3.8
3817db96d56Sopenharmony_ci
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci.. function:: pause()
3847db96d56Sopenharmony_ci
3857db96d56Sopenharmony_ci   Cause the process to sleep until a signal is received; the appropriate handler
3867db96d56Sopenharmony_ci   will then be called.  Returns nothing.
3877db96d56Sopenharmony_ci
3887db96d56Sopenharmony_ci   .. availability:: Unix.
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci      See the man page :manpage:`signal(2)` for further information.
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_ci   See also :func:`sigwait`, :func:`sigwaitinfo`, :func:`sigtimedwait` and
3937db96d56Sopenharmony_ci   :func:`sigpending`.
3947db96d56Sopenharmony_ci
3957db96d56Sopenharmony_ci
3967db96d56Sopenharmony_ci.. function:: raise_signal(signum)
3977db96d56Sopenharmony_ci
3987db96d56Sopenharmony_ci   Sends a signal to the calling process. Returns nothing.
3997db96d56Sopenharmony_ci
4007db96d56Sopenharmony_ci   .. versionadded:: 3.8
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ci.. function:: pidfd_send_signal(pidfd, sig, siginfo=None, flags=0)
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ci   Send signal *sig* to the process referred to by file descriptor *pidfd*.
4067db96d56Sopenharmony_ci   Python does not currently support the *siginfo* parameter; it must be
4077db96d56Sopenharmony_ci   ``None``.  The *flags* argument is provided for future extensions; no flag
4087db96d56Sopenharmony_ci   values are currently defined.
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ci   See the :manpage:`pidfd_send_signal(2)` man page for more information.
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ci   .. availability:: Linux >= 5.1
4137db96d56Sopenharmony_ci   .. versionadded:: 3.9
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci.. function:: pthread_kill(thread_id, signalnum)
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci   Send the signal *signalnum* to the thread *thread_id*, another thread in the
4197db96d56Sopenharmony_ci   same process as the caller.  The target thread can be executing any code
4207db96d56Sopenharmony_ci   (Python or not).  However, if the target thread is executing the Python
4217db96d56Sopenharmony_ci   interpreter, the Python signal handlers will be :ref:`executed by the main
4227db96d56Sopenharmony_ci   thread of the main interpreter <signals-and-threads>`.  Therefore, the only point of sending a
4237db96d56Sopenharmony_ci   signal to a particular Python thread would be to force a running system call
4247db96d56Sopenharmony_ci   to fail with :exc:`InterruptedError`.
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ci   Use :func:`threading.get_ident()` or the :attr:`~threading.Thread.ident`
4277db96d56Sopenharmony_ci   attribute of :class:`threading.Thread` objects to get a suitable value
4287db96d56Sopenharmony_ci   for *thread_id*.
4297db96d56Sopenharmony_ci
4307db96d56Sopenharmony_ci   If *signalnum* is 0, then no signal is sent, but error checking is still
4317db96d56Sopenharmony_ci   performed; this can be used to check if the target thread is still running.
4327db96d56Sopenharmony_ci
4337db96d56Sopenharmony_ci   .. audit-event:: signal.pthread_kill thread_id,signalnum signal.pthread_kill
4347db96d56Sopenharmony_ci
4357db96d56Sopenharmony_ci   .. availability:: Unix.
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ci      See the man page :manpage:`pthread_kill(3)` for further  information.
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci   See also :func:`os.kill`.
4407db96d56Sopenharmony_ci
4417db96d56Sopenharmony_ci   .. versionadded:: 3.3
4427db96d56Sopenharmony_ci
4437db96d56Sopenharmony_ci
4447db96d56Sopenharmony_ci.. function:: pthread_sigmask(how, mask)
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ci   Fetch and/or change the signal mask of the calling thread.  The signal mask
4477db96d56Sopenharmony_ci   is the set of signals whose delivery is currently blocked for the caller.
4487db96d56Sopenharmony_ci   Return the old signal mask as a set of signals.
4497db96d56Sopenharmony_ci
4507db96d56Sopenharmony_ci   The behavior of the call is dependent on the value of *how*, as follows.
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ci   * :data:`SIG_BLOCK`: The set of blocked signals is the union of the current
4537db96d56Sopenharmony_ci     set and the *mask* argument.
4547db96d56Sopenharmony_ci   * :data:`SIG_UNBLOCK`: The signals in *mask* are removed from the current
4557db96d56Sopenharmony_ci     set of blocked signals.  It is permissible to attempt to unblock a
4567db96d56Sopenharmony_ci     signal which is not blocked.
4577db96d56Sopenharmony_ci   * :data:`SIG_SETMASK`: The set of blocked signals is set to the *mask*
4587db96d56Sopenharmony_ci     argument.
4597db96d56Sopenharmony_ci
4607db96d56Sopenharmony_ci   *mask* is a set of signal numbers (e.g. {:const:`signal.SIGINT`,
4617db96d56Sopenharmony_ci   :const:`signal.SIGTERM`}). Use :func:`~signal.valid_signals` for a full
4627db96d56Sopenharmony_ci   mask including all signals.
4637db96d56Sopenharmony_ci
4647db96d56Sopenharmony_ci   For example, ``signal.pthread_sigmask(signal.SIG_BLOCK, [])`` reads the
4657db96d56Sopenharmony_ci   signal mask of the calling thread.
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci   :data:`SIGKILL` and :data:`SIGSTOP` cannot be blocked.
4687db96d56Sopenharmony_ci
4697db96d56Sopenharmony_ci   .. availability:: Unix.
4707db96d56Sopenharmony_ci
4717db96d56Sopenharmony_ci      See the man page :manpage:`sigprocmask(2)` and
4727db96d56Sopenharmony_ci      :manpage:`pthread_sigmask(3)` for further information.
4737db96d56Sopenharmony_ci
4747db96d56Sopenharmony_ci   See also :func:`pause`, :func:`sigpending` and :func:`sigwait`.
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci   .. versionadded:: 3.3
4777db96d56Sopenharmony_ci
4787db96d56Sopenharmony_ci
4797db96d56Sopenharmony_ci.. function:: setitimer(which, seconds, interval=0.0)
4807db96d56Sopenharmony_ci
4817db96d56Sopenharmony_ci   Sets given interval timer (one of :const:`signal.ITIMER_REAL`,
4827db96d56Sopenharmony_ci   :const:`signal.ITIMER_VIRTUAL` or :const:`signal.ITIMER_PROF`) specified
4837db96d56Sopenharmony_ci   by *which* to fire after *seconds* (float is accepted, different from
4847db96d56Sopenharmony_ci   :func:`alarm`) and after that every *interval* seconds (if *interval*
4857db96d56Sopenharmony_ci   is non-zero). The interval timer specified by *which* can be cleared by
4867db96d56Sopenharmony_ci   setting *seconds* to zero.
4877db96d56Sopenharmony_ci
4887db96d56Sopenharmony_ci   When an interval timer fires, a signal is sent to the process.
4897db96d56Sopenharmony_ci   The signal sent is dependent on the timer being used;
4907db96d56Sopenharmony_ci   :const:`signal.ITIMER_REAL` will deliver :const:`SIGALRM`,
4917db96d56Sopenharmony_ci   :const:`signal.ITIMER_VIRTUAL` sends :const:`SIGVTALRM`,
4927db96d56Sopenharmony_ci   and :const:`signal.ITIMER_PROF` will deliver :const:`SIGPROF`.
4937db96d56Sopenharmony_ci
4947db96d56Sopenharmony_ci   The old values are returned as a tuple: (delay, interval).
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ci   Attempting to pass an invalid interval timer will cause an
4977db96d56Sopenharmony_ci   :exc:`ItimerError`.
4987db96d56Sopenharmony_ci
4997db96d56Sopenharmony_ci   .. availability:: Unix.
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci
5027db96d56Sopenharmony_ci.. function:: getitimer(which)
5037db96d56Sopenharmony_ci
5047db96d56Sopenharmony_ci   Returns current value of a given interval timer specified by *which*.
5057db96d56Sopenharmony_ci
5067db96d56Sopenharmony_ci   .. availability:: Unix.
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_ci
5097db96d56Sopenharmony_ci.. function:: set_wakeup_fd(fd, *, warn_on_full_buffer=True)
5107db96d56Sopenharmony_ci
5117db96d56Sopenharmony_ci   Set the wakeup file descriptor to *fd*.  When a signal is received, the
5127db96d56Sopenharmony_ci   signal number is written as a single byte into the fd.  This can be used by
5137db96d56Sopenharmony_ci   a library to wakeup a poll or select call, allowing the signal to be fully
5147db96d56Sopenharmony_ci   processed.
5157db96d56Sopenharmony_ci
5167db96d56Sopenharmony_ci   The old wakeup fd is returned (or -1 if file descriptor wakeup was not
5177db96d56Sopenharmony_ci   enabled).  If *fd* is -1, file descriptor wakeup is disabled.
5187db96d56Sopenharmony_ci   If not -1, *fd* must be non-blocking.  It is up to the library to remove
5197db96d56Sopenharmony_ci   any bytes from *fd* before calling poll or select again.
5207db96d56Sopenharmony_ci
5217db96d56Sopenharmony_ci   When threads are enabled, this function can only be called
5227db96d56Sopenharmony_ci   from :ref:`the main thread of the main interpreter <signals-and-threads>`;
5237db96d56Sopenharmony_ci   attempting to call it from other threads will cause a :exc:`ValueError`
5247db96d56Sopenharmony_ci   exception to be raised.
5257db96d56Sopenharmony_ci
5267db96d56Sopenharmony_ci   There are two common ways to use this function. In both approaches,
5277db96d56Sopenharmony_ci   you use the fd to wake up when a signal arrives, but then they
5287db96d56Sopenharmony_ci   differ in how they determine *which* signal or signals have
5297db96d56Sopenharmony_ci   arrived.
5307db96d56Sopenharmony_ci
5317db96d56Sopenharmony_ci   In the first approach, we read the data out of the fd's buffer, and
5327db96d56Sopenharmony_ci   the byte values give you the signal numbers. This is simple, but in
5337db96d56Sopenharmony_ci   rare cases it can run into a problem: generally the fd will have a
5347db96d56Sopenharmony_ci   limited amount of buffer space, and if too many signals arrive too
5357db96d56Sopenharmony_ci   quickly, then the buffer may become full, and some signals may be
5367db96d56Sopenharmony_ci   lost. If you use this approach, then you should set
5377db96d56Sopenharmony_ci   ``warn_on_full_buffer=True``, which will at least cause a warning
5387db96d56Sopenharmony_ci   to be printed to stderr when signals are lost.
5397db96d56Sopenharmony_ci
5407db96d56Sopenharmony_ci   In the second approach, we use the wakeup fd *only* for wakeups,
5417db96d56Sopenharmony_ci   and ignore the actual byte values. In this case, all we care about
5427db96d56Sopenharmony_ci   is whether the fd's buffer is empty or non-empty; a full buffer
5437db96d56Sopenharmony_ci   doesn't indicate a problem at all. If you use this approach, then
5447db96d56Sopenharmony_ci   you should set ``warn_on_full_buffer=False``, so that your users
5457db96d56Sopenharmony_ci   are not confused by spurious warning messages.
5467db96d56Sopenharmony_ci
5477db96d56Sopenharmony_ci   .. versionchanged:: 3.5
5487db96d56Sopenharmony_ci      On Windows, the function now also supports socket handles.
5497db96d56Sopenharmony_ci
5507db96d56Sopenharmony_ci   .. versionchanged:: 3.7
5517db96d56Sopenharmony_ci      Added ``warn_on_full_buffer`` parameter.
5527db96d56Sopenharmony_ci
5537db96d56Sopenharmony_ci.. function:: siginterrupt(signalnum, flag)
5547db96d56Sopenharmony_ci
5557db96d56Sopenharmony_ci   Change system call restart behaviour: if *flag* is :const:`False`, system
5567db96d56Sopenharmony_ci   calls will be restarted when interrupted by signal *signalnum*, otherwise
5577db96d56Sopenharmony_ci   system calls will be interrupted.  Returns nothing.
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ci   .. availability:: Unix.
5607db96d56Sopenharmony_ci
5617db96d56Sopenharmony_ci      See the man page :manpage:`siginterrupt(3)` for further information.
5627db96d56Sopenharmony_ci
5637db96d56Sopenharmony_ci   Note that installing a signal handler with :func:`signal` will reset the
5647db96d56Sopenharmony_ci   restart behaviour to interruptible by implicitly calling
5657db96d56Sopenharmony_ci   :c:func:`siginterrupt` with a true *flag* value for the given signal.
5667db96d56Sopenharmony_ci
5677db96d56Sopenharmony_ci
5687db96d56Sopenharmony_ci.. function:: signal(signalnum, handler)
5697db96d56Sopenharmony_ci
5707db96d56Sopenharmony_ci   Set the handler for signal *signalnum* to the function *handler*.  *handler* can
5717db96d56Sopenharmony_ci   be a callable Python object taking two arguments (see below), or one of the
5727db96d56Sopenharmony_ci   special values :const:`signal.SIG_IGN` or :const:`signal.SIG_DFL`.  The previous
5737db96d56Sopenharmony_ci   signal handler will be returned (see the description of :func:`getsignal`
5747db96d56Sopenharmony_ci   above).  (See the Unix man page :manpage:`signal(2)` for further information.)
5757db96d56Sopenharmony_ci
5767db96d56Sopenharmony_ci   When threads are enabled, this function can only be called
5777db96d56Sopenharmony_ci   from :ref:`the main thread of the main interpreter <signals-and-threads>`;
5787db96d56Sopenharmony_ci   attempting to call it from other threads will cause a :exc:`ValueError`
5797db96d56Sopenharmony_ci   exception to be raised.
5807db96d56Sopenharmony_ci
5817db96d56Sopenharmony_ci   The *handler* is called with two arguments: the signal number and the current
5827db96d56Sopenharmony_ci   stack frame (``None`` or a frame object; for a description of frame objects,
5837db96d56Sopenharmony_ci   see the :ref:`description in the type hierarchy <frame-objects>` or see the
5847db96d56Sopenharmony_ci   attribute descriptions in the :mod:`inspect` module).
5857db96d56Sopenharmony_ci
5867db96d56Sopenharmony_ci   On Windows, :func:`signal` can only be called with :const:`SIGABRT`,
5877db96d56Sopenharmony_ci   :const:`SIGFPE`, :const:`SIGILL`, :const:`SIGINT`, :const:`SIGSEGV`,
5887db96d56Sopenharmony_ci   :const:`SIGTERM`, or :const:`SIGBREAK`.
5897db96d56Sopenharmony_ci   A :exc:`ValueError` will be raised in any other case.
5907db96d56Sopenharmony_ci   Note that not all systems define the same set of signal names; an
5917db96d56Sopenharmony_ci   :exc:`AttributeError` will be raised if a signal name is not defined as
5927db96d56Sopenharmony_ci   ``SIG*`` module level constant.
5937db96d56Sopenharmony_ci
5947db96d56Sopenharmony_ci
5957db96d56Sopenharmony_ci.. function:: sigpending()
5967db96d56Sopenharmony_ci
5977db96d56Sopenharmony_ci   Examine the set of signals that are pending for delivery to the calling
5987db96d56Sopenharmony_ci   thread (i.e., the signals which have been raised while blocked).  Return the
5997db96d56Sopenharmony_ci   set of the pending signals.
6007db96d56Sopenharmony_ci
6017db96d56Sopenharmony_ci   .. availability:: Unix.
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci      See the man page :manpage:`sigpending(2)` for further information.
6047db96d56Sopenharmony_ci
6057db96d56Sopenharmony_ci   See also :func:`pause`, :func:`pthread_sigmask` and :func:`sigwait`.
6067db96d56Sopenharmony_ci
6077db96d56Sopenharmony_ci   .. versionadded:: 3.3
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci
6107db96d56Sopenharmony_ci.. function:: sigwait(sigset)
6117db96d56Sopenharmony_ci
6127db96d56Sopenharmony_ci   Suspend execution of the calling thread until the delivery of one of the
6137db96d56Sopenharmony_ci   signals specified in the signal set *sigset*.  The function accepts the signal
6147db96d56Sopenharmony_ci   (removes it from the pending list of signals), and returns the signal number.
6157db96d56Sopenharmony_ci
6167db96d56Sopenharmony_ci   .. availability:: Unix.
6177db96d56Sopenharmony_ci
6187db96d56Sopenharmony_ci      See the man page :manpage:`sigwait(3)` for further information.
6197db96d56Sopenharmony_ci
6207db96d56Sopenharmony_ci   See also :func:`pause`, :func:`pthread_sigmask`, :func:`sigpending`,
6217db96d56Sopenharmony_ci   :func:`sigwaitinfo` and :func:`sigtimedwait`.
6227db96d56Sopenharmony_ci
6237db96d56Sopenharmony_ci   .. versionadded:: 3.3
6247db96d56Sopenharmony_ci
6257db96d56Sopenharmony_ci
6267db96d56Sopenharmony_ci.. function:: sigwaitinfo(sigset)
6277db96d56Sopenharmony_ci
6287db96d56Sopenharmony_ci   Suspend execution of the calling thread until the delivery of one of the
6297db96d56Sopenharmony_ci   signals specified in the signal set *sigset*.  The function accepts the
6307db96d56Sopenharmony_ci   signal and removes it from the pending list of signals. If one of the
6317db96d56Sopenharmony_ci   signals in *sigset* is already pending for the calling thread, the function
6327db96d56Sopenharmony_ci   will return immediately with information about that signal. The signal
6337db96d56Sopenharmony_ci   handler is not called for the delivered signal. The function raises an
6347db96d56Sopenharmony_ci   :exc:`InterruptedError` if it is interrupted by a signal that is not in
6357db96d56Sopenharmony_ci   *sigset*.
6367db96d56Sopenharmony_ci
6377db96d56Sopenharmony_ci   The return value is an object representing the data contained in the
6387db96d56Sopenharmony_ci   :c:type:`siginfo_t` structure, namely: :attr:`si_signo`, :attr:`si_code`,
6397db96d56Sopenharmony_ci   :attr:`si_errno`, :attr:`si_pid`, :attr:`si_uid`, :attr:`si_status`,
6407db96d56Sopenharmony_ci   :attr:`si_band`.
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ci   .. availability:: Unix.
6437db96d56Sopenharmony_ci
6447db96d56Sopenharmony_ci      See the man page :manpage:`sigwaitinfo(2)` for further information.
6457db96d56Sopenharmony_ci
6467db96d56Sopenharmony_ci   See also :func:`pause`, :func:`sigwait` and :func:`sigtimedwait`.
6477db96d56Sopenharmony_ci
6487db96d56Sopenharmony_ci   .. versionadded:: 3.3
6497db96d56Sopenharmony_ci
6507db96d56Sopenharmony_ci   .. versionchanged:: 3.5
6517db96d56Sopenharmony_ci      The function is now retried if interrupted by a signal not in *sigset*
6527db96d56Sopenharmony_ci      and the signal handler does not raise an exception (see :pep:`475` for
6537db96d56Sopenharmony_ci      the rationale).
6547db96d56Sopenharmony_ci
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci.. function:: sigtimedwait(sigset, timeout)
6577db96d56Sopenharmony_ci
6587db96d56Sopenharmony_ci   Like :func:`sigwaitinfo`, but takes an additional *timeout* argument
6597db96d56Sopenharmony_ci   specifying a timeout. If *timeout* is specified as :const:`0`, a poll is
6607db96d56Sopenharmony_ci   performed. Returns :const:`None` if a timeout occurs.
6617db96d56Sopenharmony_ci
6627db96d56Sopenharmony_ci   .. availability:: Unix.
6637db96d56Sopenharmony_ci
6647db96d56Sopenharmony_ci      See the man page :manpage:`sigtimedwait(2)` for further information.
6657db96d56Sopenharmony_ci
6667db96d56Sopenharmony_ci   See also :func:`pause`, :func:`sigwait` and :func:`sigwaitinfo`.
6677db96d56Sopenharmony_ci
6687db96d56Sopenharmony_ci   .. versionadded:: 3.3
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci   .. versionchanged:: 3.5
6717db96d56Sopenharmony_ci      The function is now retried with the recomputed *timeout* if interrupted
6727db96d56Sopenharmony_ci      by a signal not in *sigset* and the signal handler does not raise an
6737db96d56Sopenharmony_ci      exception (see :pep:`475` for the rationale).
6747db96d56Sopenharmony_ci
6757db96d56Sopenharmony_ci
6767db96d56Sopenharmony_ci.. _signal-example:
6777db96d56Sopenharmony_ci
6787db96d56Sopenharmony_ciExamples
6797db96d56Sopenharmony_ci--------
6807db96d56Sopenharmony_ci
6817db96d56Sopenharmony_ciHere is a minimal example program. It uses the :func:`alarm` function to limit
6827db96d56Sopenharmony_cithe time spent waiting to open a file; this is useful if the file is for a
6837db96d56Sopenharmony_ciserial device that may not be turned on, which would normally cause the
6847db96d56Sopenharmony_ci:func:`os.open` to hang indefinitely.  The solution is to set a 5-second alarm
6857db96d56Sopenharmony_cibefore opening the file; if the operation takes too long, the alarm signal will
6867db96d56Sopenharmony_cibe sent, and the handler raises an exception. ::
6877db96d56Sopenharmony_ci
6887db96d56Sopenharmony_ci   import signal, os
6897db96d56Sopenharmony_ci
6907db96d56Sopenharmony_ci   def handler(signum, frame):
6917db96d56Sopenharmony_ci       signame = signal.Signals(signum).name
6927db96d56Sopenharmony_ci       print(f'Signal handler called with signal {signame} ({signum})')
6937db96d56Sopenharmony_ci       raise OSError("Couldn't open device!")
6947db96d56Sopenharmony_ci
6957db96d56Sopenharmony_ci   # Set the signal handler and a 5-second alarm
6967db96d56Sopenharmony_ci   signal.signal(signal.SIGALRM, handler)
6977db96d56Sopenharmony_ci   signal.alarm(5)
6987db96d56Sopenharmony_ci
6997db96d56Sopenharmony_ci   # This open() may hang indefinitely
7007db96d56Sopenharmony_ci   fd = os.open('/dev/ttyS0', os.O_RDWR)
7017db96d56Sopenharmony_ci
7027db96d56Sopenharmony_ci   signal.alarm(0)          # Disable the alarm
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_ciNote on SIGPIPE
7057db96d56Sopenharmony_ci---------------
7067db96d56Sopenharmony_ci
7077db96d56Sopenharmony_ciPiping output of your program to tools like :manpage:`head(1)` will
7087db96d56Sopenharmony_cicause a :const:`SIGPIPE` signal to be sent to your process when the receiver
7097db96d56Sopenharmony_ciof its standard output closes early.  This results in an exception
7107db96d56Sopenharmony_cilike :code:`BrokenPipeError: [Errno 32] Broken pipe`.  To handle this
7117db96d56Sopenharmony_cicase, wrap your entry point to catch this exception as follows::
7127db96d56Sopenharmony_ci
7137db96d56Sopenharmony_ci    import os
7147db96d56Sopenharmony_ci    import sys
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_ci    def main():
7177db96d56Sopenharmony_ci        try:
7187db96d56Sopenharmony_ci            # simulate large output (your code replaces this loop)
7197db96d56Sopenharmony_ci            for x in range(10000):
7207db96d56Sopenharmony_ci                print("y")
7217db96d56Sopenharmony_ci            # flush output here to force SIGPIPE to be triggered
7227db96d56Sopenharmony_ci            # while inside this try block.
7237db96d56Sopenharmony_ci            sys.stdout.flush()
7247db96d56Sopenharmony_ci        except BrokenPipeError:
7257db96d56Sopenharmony_ci            # Python flushes standard streams on exit; redirect remaining output
7267db96d56Sopenharmony_ci            # to devnull to avoid another BrokenPipeError at shutdown
7277db96d56Sopenharmony_ci            devnull = os.open(os.devnull, os.O_WRONLY)
7287db96d56Sopenharmony_ci            os.dup2(devnull, sys.stdout.fileno())
7297db96d56Sopenharmony_ci            sys.exit(1)  # Python exits with error code 1 on EPIPE
7307db96d56Sopenharmony_ci
7317db96d56Sopenharmony_ci    if __name__ == '__main__':
7327db96d56Sopenharmony_ci        main()
7337db96d56Sopenharmony_ci
7347db96d56Sopenharmony_ciDo not set :const:`SIGPIPE`'s disposition to :const:`SIG_DFL` in
7357db96d56Sopenharmony_ciorder to avoid :exc:`BrokenPipeError`.  Doing that would cause
7367db96d56Sopenharmony_ciyour program to exit unexpectedly whenever any socket
7377db96d56Sopenharmony_ciconnection is interrupted while your program is still writing to
7387db96d56Sopenharmony_ciit.
7397db96d56Sopenharmony_ci
7407db96d56Sopenharmony_ci.. _handlers-and-exceptions:
7417db96d56Sopenharmony_ci
7427db96d56Sopenharmony_ciNote on Signal Handlers and Exceptions
7437db96d56Sopenharmony_ci--------------------------------------
7447db96d56Sopenharmony_ci
7457db96d56Sopenharmony_ciIf a signal handler raises an exception, the exception will be propagated to
7467db96d56Sopenharmony_cithe main thread and may be raised after any :term:`bytecode` instruction. Most
7477db96d56Sopenharmony_cinotably, a :exc:`KeyboardInterrupt` may appear at any point during execution.
7487db96d56Sopenharmony_ciMost Python code, including the standard library, cannot be made robust against
7497db96d56Sopenharmony_cithis, and so a :exc:`KeyboardInterrupt` (or any other exception resulting from
7507db96d56Sopenharmony_cia signal handler) may on rare occasions put the program in an unexpected state.
7517db96d56Sopenharmony_ci
7527db96d56Sopenharmony_ciTo illustrate this issue, consider the following code::
7537db96d56Sopenharmony_ci
7547db96d56Sopenharmony_ci    class SpamContext:
7557db96d56Sopenharmony_ci        def __init__(self):
7567db96d56Sopenharmony_ci            self.lock = threading.Lock()
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_ci        def __enter__(self):
7597db96d56Sopenharmony_ci            # If KeyboardInterrupt occurs here, everything is fine
7607db96d56Sopenharmony_ci            self.lock.acquire()
7617db96d56Sopenharmony_ci            # If KeyboardInterrupt occurs here, __exit__ will not be called
7627db96d56Sopenharmony_ci            ...
7637db96d56Sopenharmony_ci            # KeyboardInterrupt could occur just before the function returns
7647db96d56Sopenharmony_ci
7657db96d56Sopenharmony_ci        def __exit__(self, exc_type, exc_val, exc_tb):
7667db96d56Sopenharmony_ci            ...
7677db96d56Sopenharmony_ci            self.lock.release()
7687db96d56Sopenharmony_ci
7697db96d56Sopenharmony_ciFor many programs, especially those that merely want to exit on
7707db96d56Sopenharmony_ci:exc:`KeyboardInterrupt`, this is not a problem, but applications that are
7717db96d56Sopenharmony_cicomplex or require high reliability should avoid raising exceptions from signal
7727db96d56Sopenharmony_cihandlers. They should also avoid catching :exc:`KeyboardInterrupt` as a means
7737db96d56Sopenharmony_ciof gracefully shutting down.  Instead, they should install their own
7747db96d56Sopenharmony_ci:const:`SIGINT` handler. Below is an example of an HTTP server that avoids
7757db96d56Sopenharmony_ci:exc:`KeyboardInterrupt`::
7767db96d56Sopenharmony_ci
7777db96d56Sopenharmony_ci    import signal
7787db96d56Sopenharmony_ci    import socket
7797db96d56Sopenharmony_ci    from selectors import DefaultSelector, EVENT_READ
7807db96d56Sopenharmony_ci    from http.server import HTTPServer, SimpleHTTPRequestHandler
7817db96d56Sopenharmony_ci
7827db96d56Sopenharmony_ci    interrupt_read, interrupt_write = socket.socketpair()
7837db96d56Sopenharmony_ci
7847db96d56Sopenharmony_ci    def handler(signum, frame):
7857db96d56Sopenharmony_ci        print('Signal handler called with signal', signum)
7867db96d56Sopenharmony_ci        interrupt_write.send(b'\0')
7877db96d56Sopenharmony_ci    signal.signal(signal.SIGINT, handler)
7887db96d56Sopenharmony_ci
7897db96d56Sopenharmony_ci    def serve_forever(httpd):
7907db96d56Sopenharmony_ci        sel = DefaultSelector()
7917db96d56Sopenharmony_ci        sel.register(interrupt_read, EVENT_READ)
7927db96d56Sopenharmony_ci        sel.register(httpd, EVENT_READ)
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci        while True:
7957db96d56Sopenharmony_ci            for key, _ in sel.select():
7967db96d56Sopenharmony_ci                if key.fileobj == interrupt_read:
7977db96d56Sopenharmony_ci                    interrupt_read.recv(1)
7987db96d56Sopenharmony_ci                    return
7997db96d56Sopenharmony_ci                if key.fileobj == httpd:
8007db96d56Sopenharmony_ci                    httpd.handle_request()
8017db96d56Sopenharmony_ci
8027db96d56Sopenharmony_ci    print("Serving on port 8000")
8037db96d56Sopenharmony_ci    httpd = HTTPServer(('', 8000), SimpleHTTPRequestHandler)
8047db96d56Sopenharmony_ci    serve_forever(httpd)
8057db96d56Sopenharmony_ci    print("Shutdown...")
806