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