778 lines
78 KiB
HTML
778 lines
78 KiB
HTML
|
||
<!DOCTYPE html>
|
||
|
||
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_CN">
|
||
<head>
|
||
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
|
||
|
||
<title>signal --- 设置异步事件处理程序 — Python 3.8.20 文档</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
||
<link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
|
||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||
|
||
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
|
||
<script src="../_static/jquery.js"></script>
|
||
<script src="../_static/underscore.js"></script>
|
||
<script src="../_static/doctools.js"></script>
|
||
<script src="../_static/language_data.js"></script>
|
||
<script src="../_static/translations.js"></script>
|
||
|
||
<script src="../_static/sidebar.js"></script>
|
||
|
||
<link rel="search" type="application/opensearchdescription+xml"
|
||
title="在 Python 3.8.20 文档 中搜索"
|
||
href="../_static/opensearch.xml"/>
|
||
<link rel="author" title="关于这些文档" href="../about.html" />
|
||
<link rel="index" title="索引" href="../genindex.html" />
|
||
<link rel="search" title="搜索" href="../search.html" />
|
||
<link rel="copyright" title="版权所有" href="../copyright.html" />
|
||
<link rel="next" title="mmap --- 内存映射文件支持" href="mmap.html" />
|
||
<link rel="prev" title="asynchat --- 异步套接字指令/响应处理程序" href="asynchat.html" />
|
||
<link rel="canonical" href="https://docs.python.org/3/library/signal.html" />
|
||
|
||
|
||
|
||
|
||
|
||
<style>
|
||
@media only screen {
|
||
table.full-width-table {
|
||
width: 100%;
|
||
}
|
||
}
|
||
</style>
|
||
<link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
|
||
<script type="text/javascript" src="../_static/copybutton.js"></script>
|
||
<script type="text/javascript" src="../_static/menu.js"></script>
|
||
|
||
</head>
|
||
<body>
|
||
<div class="mobile-nav">
|
||
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
|
||
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
|
||
<label for="menuToggler" class="toggler__label">
|
||
<span></span>
|
||
</label>
|
||
<nav class="nav-content" role="navigation">
|
||
<a href="https://www.python.org/" class="nav-logo">
|
||
<img src="../_static/py.svg" alt="Logo"/>
|
||
</a>
|
||
<div class="version_switcher_placeholder"></div>
|
||
<form role="search" class="search" action="../search.html" method="get">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
|
||
<path fill-rule="nonzero"
|
||
d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" fill="#444"></path>
|
||
</svg>
|
||
<input type="text" name="q" aria-label="快速搜索"/>
|
||
<input type="submit" value="转向"/>
|
||
</form>
|
||
</nav>
|
||
<div class="menu-wrapper">
|
||
<nav class="menu" role="navigation" aria-label="main navigation">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<h3><a href="../contents.html">目录</a></h3>
|
||
<ul>
|
||
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">signal</span></code> --- 设置异步事件处理程序</a><ul>
|
||
<li><a class="reference internal" href="#general-rules">一般规则</a><ul>
|
||
<li><a class="reference internal" href="#execution-of-python-signal-handlers">执行 Python 信号处理程序</a></li>
|
||
<li><a class="reference internal" href="#signals-and-threads">信号与线程</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#module-contents">模块内容</a></li>
|
||
<li><a class="reference internal" href="#example">示例</a></li>
|
||
<li><a class="reference internal" href="#note-on-sigpipe">对于 SIGPIPE 的说明</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
<h4>上一个主题</h4>
|
||
<p class="topless"><a href="asynchat.html"
|
||
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">asynchat</span></code> --- 异步套接字指令/响应处理程序</a></p>
|
||
<h4>下一个主题</h4>
|
||
<p class="topless"><a href="mmap.html"
|
||
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mmap</span></code> --- 内存映射文件支持</a></p>
|
||
<div role="note" aria-label="source link">
|
||
<h3>本页</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="../bugs.html">报告 Bug</a></li>
|
||
<li>
|
||
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/signal.rst"
|
||
rel="nofollow">显示源代码
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outdated-warning" style="padding: .5em; text-align: center; background-color: #FFBABA; color: #6A0E0E;">
|
||
这个文档所针对的是一个已不再受支持的 Python 旧版本。
|
||
你应当升级版本,并阅读
|
||
<a href="/3/library/signal.html"> Python 当前稳定版本的文档</a>.
|
||
</div>
|
||
|
||
<div class="related" role="navigation" aria-label="related navigation">
|
||
<h3>导航</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="../genindex.html" title="总目录"
|
||
accesskey="I">索引</a></li>
|
||
<li class="right" >
|
||
<a href="../py-modindex.html" title="Python 模块索引"
|
||
>模块</a> |</li>
|
||
<li class="right" >
|
||
<a href="mmap.html" title="mmap --- 内存映射文件支持"
|
||
accesskey="N">下一页</a> |</li>
|
||
<li class="right" >
|
||
<a href="asynchat.html" title="asynchat --- 异步套接字指令/响应处理程序"
|
||
accesskey="P">上一页</a> |</li>
|
||
|
||
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
|
||
<li><a href="https://www.python.org/">Python</a> »</li>
|
||
<li class="switchers">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<div class="version_switcher_placeholder"></div>
|
||
</li>
|
||
<li>
|
||
|
||
</li>
|
||
<li id="cpython-language-and-version">
|
||
<a href="../index.html">3.8.20 Documentation</a> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> »</li>
|
||
<li class="nav-item nav-item-2"><a href="ipc.html" accesskey="U">网络和进程间通信</a> »</li>
|
||
<li class="right">
|
||
|
||
|
||
<div class="inline-search" role="search">
|
||
<form class="inline-search" action="../search.html" method="get">
|
||
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
|
||
<input type="submit" value="转向" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
|
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="document">
|
||
<div class="documentwrapper">
|
||
<div class="bodywrapper">
|
||
<div class="body" role="main">
|
||
|
||
<section id="module-signal">
|
||
<span id="signal-set-handlers-for-asynchronous-events"></span><h1><a class="reference internal" href="#module-signal" title="signal: Set handlers for asynchronous events."><code class="xref py py-mod docutils literal notranslate"><span class="pre">signal</span></code></a> --- 设置异步事件处理程序<a class="headerlink" href="#module-signal" title="永久链接至标题">¶</a></h1>
|
||
<hr class="docutils" />
|
||
<p>该模块提供了在 Python 中使用信号处理程序的机制。</p>
|
||
<section id="general-rules">
|
||
<h2>一般规则<a class="headerlink" href="#general-rules" title="永久链接至标题">¶</a></h2>
|
||
<p><a class="reference internal" href="#signal.signal" title="signal.signal"><code class="xref py py-func docutils literal notranslate"><span class="pre">signal.signal()</span></code></a> 函数允许定义在接收到信号时执行的自定义处理程序。少量的默认处理程序已经设置: <a class="reference internal" href="#signal.SIGPIPE" title="signal.SIGPIPE"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGPIPE</span></code></a> 被忽略(因此管道和套接字上的写入错误可以报告为普通的 Python 异常)以及如果父进程没有更改 <a class="reference internal" href="#signal.SIGINT" title="signal.SIGINT"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGINT</span></code></a> ,则其会被翻译成 <a class="reference internal" href="exceptions.html#KeyboardInterrupt" title="KeyboardInterrupt"><code class="xref py py-exc docutils literal notranslate"><span class="pre">KeyboardInterrupt</span></code></a> 异常。</p>
|
||
<p>一旦设置,特定信号的处理程序将保持安装,直到它被显式重置( Python 模拟 BSD 样式接口而不管底层实现),但 <a class="reference internal" href="#signal.SIGCHLD" title="signal.SIGCHLD"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGCHLD</span></code></a> 的处理程序除外,它遵循底层实现。</p>
|
||
<section id="execution-of-python-signal-handlers">
|
||
<h3>执行 Python 信号处理程序<a class="headerlink" href="#execution-of-python-signal-handlers" title="永久链接至标题">¶</a></h3>
|
||
<p>Python 信号处理程序不会在低级( C )信号处理程序中执行。相反,低级信号处理程序设置一个标志,告诉 <a class="reference internal" href="../glossary.html#term-virtual-machine"><span class="xref std std-term">virtual machine</span></a> 稍后执行相应的 Python 信号处理程序(例如在下一个 <a class="reference internal" href="../glossary.html#term-bytecode"><span class="xref std std-term">bytecode</span></a> 指令)。这会导致:</p>
|
||
<ul class="simple">
|
||
<li><p>捕获同步错误是没有意义的,例如 <a class="reference internal" href="#signal.SIGFPE" title="signal.SIGFPE"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGFPE</span></code></a> 或 <a class="reference internal" href="#signal.SIGSEGV" title="signal.SIGSEGV"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGSEGV</span></code></a> ,它们是由 C 代码中的无效操作引起的。Python 将从信号处理程序返回到 C 代码,这可能会再次引发相同的信号,导致 Python 显然的挂起。 从Python 3.3开始,你可以使用 <a class="reference internal" href="faulthandler.html#module-faulthandler" title="faulthandler: Dump the Python traceback."><code class="xref py py-mod docutils literal notranslate"><span class="pre">faulthandler</span></code></a> 模块来报告同步错误。</p></li>
|
||
<li><p>纯 C 中实现的长时间运行的计算(例如在大量文本上的正则表达式匹配)可以在任意时间内不间断地运行,而不管接收到任何信号。计算完成后将调用 Python 信号处理程序。</p></li>
|
||
</ul>
|
||
</section>
|
||
<section id="signals-and-threads">
|
||
<span id="id1"></span><h3>信号与线程<a class="headerlink" href="#signals-and-threads" title="永久链接至标题">¶</a></h3>
|
||
<p>Python 信号处理程序总是在主 Python 线程中执行,即使信号是在另一个线程中接收的。这意味着信号不能用作线程间通信的手段。 你可以使用 <a class="reference internal" href="threading.html#module-threading" title="threading: Thread-based parallelism."><code class="xref py py-mod docutils literal notranslate"><span class="pre">threading</span></code></a> 模块中的同步原函数。</p>
|
||
<p>此外,只允许主线程设置新的信号处理程序。</p>
|
||
</section>
|
||
</section>
|
||
<section id="module-contents">
|
||
<h2>模块内容<a class="headerlink" href="#module-contents" title="永久链接至标题">¶</a></h2>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.5 版更改: </span>信号( SIG* ),处理程序( <a class="reference internal" href="#signal.SIG_DFL" title="signal.SIG_DFL"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIG_DFL</span></code></a> , <a class="reference internal" href="#signal.SIG_IGN" title="signal.SIG_IGN"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIG_IGN</span></code></a>)和 sigmask( <a class="reference internal" href="#signal.SIG_BLOCK" title="signal.SIG_BLOCK"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIG_BLOCK</span></code></a> , <a class="reference internal" href="#signal.SIG_UNBLOCK" title="signal.SIG_UNBLOCK"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIG_UNBLOCK</span></code></a> , <a class="reference internal" href="#signal.SIG_SETMASK" title="signal.SIG_SETMASK"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIG_SETMASK</span></code></a> )下面列出的相关常量变成了 <a class="reference internal" href="enum.html#enum.IntEnum" title="enum.IntEnum"><code class="xref py py-class docutils literal notranslate"><span class="pre">enums</span></code></a> 。 <a class="reference internal" href="#signal.getsignal" title="signal.getsignal"><code class="xref py py-func docutils literal notranslate"><span class="pre">getsignal()</span></code></a> , <a class="reference internal" href="#signal.pthread_sigmask" title="signal.pthread_sigmask"><code class="xref py py-func docutils literal notranslate"><span class="pre">pthread_sigmask()</span></code></a> , <a class="reference internal" href="#signal.sigpending" title="signal.sigpending"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigpending()</span></code></a> 和 <a class="reference internal" href="#signal.sigwait" title="signal.sigwait"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigwait()</span></code></a> 函数返回人类可读的 <a class="reference internal" href="enum.html#enum.IntEnum" title="enum.IntEnum"><code class="xref py py-class docutils literal notranslate"><span class="pre">enums</span></code></a> 。</p>
|
||
</div>
|
||
<p>在 <a class="reference internal" href="#module-signal" title="signal: Set handlers for asynchronous events."><code class="xref py py-mod docutils literal notranslate"><span class="pre">signal</span></code></a> 模块中定义的变量是:</p>
|
||
<dl class="data">
|
||
<dt id="signal.SIG_DFL">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIG_DFL</code><a class="headerlink" href="#signal.SIG_DFL" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>这是两种标准信号处理选项之一;它只会执行信号的默认函数。 例如,在大多数系统上,对于 <code class="xref py py-const docutils literal notranslate"><span class="pre">SIGQUIT</span></code> 的默认操作是转储核心并退出,而对于 <a class="reference internal" href="#signal.SIGCHLD" title="signal.SIGCHLD"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGCHLD</span></code></a> 的默认操作是简单地忽略它。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIG_IGN">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIG_IGN</code><a class="headerlink" href="#signal.SIG_IGN" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>这是另一个标准信号处理程序,它将简单地忽略给定的信号。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGABRT">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGABRT</code><a class="headerlink" href="#signal.SIGABRT" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>来自 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/abort(3)">abort(3)</a></em> 的中止信号。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGALRM">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGALRM</code><a class="headerlink" href="#signal.SIGALRM" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>来自 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/alarm(2)">alarm(2)</a></em> 的计时器信号。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGBREAK">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGBREAK</code><a class="headerlink" href="#signal.SIGBREAK" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>来自键盘的中断 (CTRL + BREAK)。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Windows。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGBUS">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGBUS</code><a class="headerlink" href="#signal.SIGBUS" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>总线错误 (非法的内存访问)。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGCHLD">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGCHLD</code><a class="headerlink" href="#signal.SIGCHLD" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>子进程被停止或终结。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGCLD">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGCLD</code><a class="headerlink" href="#signal.SIGCLD" title="永久链接至目标">¶</a></dt>
|
||
<dd><p><a class="reference internal" href="#signal.SIGCHLD" title="signal.SIGCHLD"><code class="xref py py-data docutils literal notranslate"><span class="pre">SIGCHLD</span></code></a> 的别名。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGCONT">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGCONT</code><a class="headerlink" href="#signal.SIGCONT" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>如果进程当前已停止则继续执行它</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGFPE">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGFPE</code><a class="headerlink" href="#signal.SIGFPE" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>浮点异常。 例如除以零。</p>
|
||
<div class="admonition seealso">
|
||
<p class="admonition-title">参见</p>
|
||
<p>当除法或求余运算的第二个参数为零时会引发 <a class="reference internal" href="exceptions.html#ZeroDivisionError" title="ZeroDivisionError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ZeroDivisionError</span></code></a> 。</p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGHUP">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGHUP</code><a class="headerlink" href="#signal.SIGHUP" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>在控制终端上检测到挂起或控制进程的终止。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGILL">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGILL</code><a class="headerlink" href="#signal.SIGILL" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>非法指令。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGINT">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGINT</code><a class="headerlink" href="#signal.SIGINT" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>来自键盘的中断 (CTRL + C)。</p>
|
||
<p>默认的动作是引发 <a class="reference internal" href="exceptions.html#KeyboardInterrupt" title="KeyboardInterrupt"><code class="xref py py-exc docutils literal notranslate"><span class="pre">KeyboardInterrupt</span></code></a>。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGKILL">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGKILL</code><a class="headerlink" href="#signal.SIGKILL" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>终止信号。</p>
|
||
<p>它不能被捕获、阻塞或忽略。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGPIPE">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGPIPE</code><a class="headerlink" href="#signal.SIGPIPE" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>损坏的管道:写入到没有读取器的管道。</p>
|
||
<p>默认的动作是忽略此信号。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGSEGV">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGSEGV</code><a class="headerlink" href="#signal.SIGSEGV" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>段错误:无效的内存引用。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGTERM">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGTERM</code><a class="headerlink" href="#signal.SIGTERM" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>终结信号。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGUSR1">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGUSR1</code><a class="headerlink" href="#signal.SIGUSR1" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>用户自定义信号 1。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGUSR2">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGUSR2</code><a class="headerlink" href="#signal.SIGUSR2" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>用户自定义信号 2。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIGWINCH">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIGWINCH</code><a class="headerlink" href="#signal.SIGWINCH" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>窗口调整大小信号。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt>
|
||
<code class="sig-name descname">SIG*</code></dt>
|
||
<dd><p>所有信号编号都是符号化定义的。 例如,挂起信号被定义为 <a class="reference internal" href="#signal.SIGHUP" title="signal.SIGHUP"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.SIGHUP</span></code></a>;变量的名称与 C 程序中使用的名称相同,具体见 <code class="docutils literal notranslate"><span class="pre"><signal.h></span></code>。 '<code class="xref c c-func docutils literal notranslate"><span class="pre">signal()</span></code>' 的 Unix 手册页面列出了现有的信号 (在某些系统上这是 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/signal(2)">signal(2)</a></em>,在其他系统中此列表则是在 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/signal(7)">signal(7)</a></em> 中)。 请注意并非所有系统都会定义相同的信号名称集;只有系统所定义的名称才会由此模块来定义。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.CTRL_C_EVENT">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">CTRL_C_EVENT</code><a class="headerlink" href="#signal.CTRL_C_EVENT" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>对应于 <kbd class="kbd docutils literal notranslate">Ctrl+C</kbd> 击键事件的信号。此信号只能用于 <a class="reference internal" href="os.html#os.kill" title="os.kill"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.kill()</span></code></a> 。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Windows。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.2 新版功能.</span></p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.CTRL_BREAK_EVENT">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">CTRL_BREAK_EVENT</code><a class="headerlink" href="#signal.CTRL_BREAK_EVENT" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>对应于 <kbd class="kbd docutils literal notranslate">Ctrl+Break</kbd> 击键事件的信号。此信号只能用于 <a class="reference internal" href="os.html#os.kill" title="os.kill"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.kill()</span></code></a> 。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Windows。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.2 新版功能.</span></p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.NSIG">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">NSIG</code><a class="headerlink" href="#signal.NSIG" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>比最高信号数多一。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.ITIMER_REAL">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">ITIMER_REAL</code><a class="headerlink" href="#signal.ITIMER_REAL" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>实时递减间隔计时器,并在到期时发送 <a class="reference internal" href="#signal.SIGALRM" title="signal.SIGALRM"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGALRM</span></code></a> 。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.ITIMER_VIRTUAL">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">ITIMER_VIRTUAL</code><a class="headerlink" href="#signal.ITIMER_VIRTUAL" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>仅在进程执行时递减间隔计时器,并在到期时发送 SIGVTALRM 。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.ITIMER_PROF">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">ITIMER_PROF</code><a class="headerlink" href="#signal.ITIMER_PROF" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>当进程执行时以及当系统替进程执行时都会减小间隔计时器。 这个计时器与 ITIMER_VIRTUAL 相配结,通常被用于分析应用程序在用户和内核空间中花费的时间。 SIGPROF 会在超期时被发送。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIG_BLOCK">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIG_BLOCK</code><a class="headerlink" href="#signal.SIG_BLOCK" title="永久链接至目标">¶</a></dt>
|
||
<dd><p><a class="reference internal" href="#signal.pthread_sigmask" title="signal.pthread_sigmask"><code class="xref py py-func docutils literal notranslate"><span class="pre">pthread_sigmask()</span></code></a> 的 <em>how</em> 形参的一个可能的值,表明信号将会被阻塞。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.3 新版功能.</span></p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIG_UNBLOCK">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIG_UNBLOCK</code><a class="headerlink" href="#signal.SIG_UNBLOCK" title="永久链接至目标">¶</a></dt>
|
||
<dd><p><a class="reference internal" href="#signal.pthread_sigmask" title="signal.pthread_sigmask"><code class="xref py py-func docutils literal notranslate"><span class="pre">pthread_sigmask()</span></code></a> 的 <em>how</em> 形参的是个可能的值,表明信号将被解除阻塞。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.3 新版功能.</span></p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="data">
|
||
<dt id="signal.SIG_SETMASK">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">SIG_SETMASK</code><a class="headerlink" href="#signal.SIG_SETMASK" title="永久链接至目标">¶</a></dt>
|
||
<dd><p><a class="reference internal" href="#signal.pthread_sigmask" title="signal.pthread_sigmask"><code class="xref py py-func docutils literal notranslate"><span class="pre">pthread_sigmask()</span></code></a> 的 <em>how</em> 形参的一个可能的值,表明信号掩码将要被替换。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.3 新版功能.</span></p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<p><a class="reference internal" href="#module-signal" title="signal: Set handlers for asynchronous events."><code class="xref py py-mod docutils literal notranslate"><span class="pre">signal</span></code></a> 模块定义了一个异常:</p>
|
||
<dl class="exception">
|
||
<dt id="signal.ItimerError">
|
||
<em class="property">exception </em><code class="sig-prename descclassname">signal.</code><code class="sig-name descname">ItimerError</code><a class="headerlink" href="#signal.ItimerError" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>作为来自下层 <a class="reference internal" href="#signal.setitimer" title="signal.setitimer"><code class="xref py py-func docutils literal notranslate"><span class="pre">setitimer()</span></code></a> 或 <a class="reference internal" href="#signal.getitimer" title="signal.getitimer"><code class="xref py py-func docutils literal notranslate"><span class="pre">getitimer()</span></code></a> 实现错误的信号被引发。 如果将无效的定时器或负的时间值传给 <a class="reference internal" href="#signal.setitimer" title="signal.setitimer"><code class="xref py py-func docutils literal notranslate"><span class="pre">setitimer()</span></code></a> 就导致这个错误。 此错误是 <a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">OSError</span></code></a> 的子类型。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.3 新版功能: </span>此错误是 <a class="reference internal" href="exceptions.html#IOError" title="IOError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">IOError</span></code></a> 的子类型,现在则是 <a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">OSError</span></code></a> 的别名。</p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<p><a class="reference internal" href="#module-signal" title="signal: Set handlers for asynchronous events."><code class="xref py py-mod docutils literal notranslate"><span class="pre">signal</span></code></a> 模块定义了以下函数:</p>
|
||
<dl class="function">
|
||
<dt id="signal.alarm">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">alarm</code><span class="sig-paren">(</span><em class="sig-param">time</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.alarm" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>如果 <em>time</em> 值非零,则此函数将要求将一个 <a class="reference internal" href="#signal.SIGALRM" title="signal.SIGALRM"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGALRM</span></code></a> 信号在 <em>time</em> 秒内发往进程。 任何在之前排入计划的警报都会被取消(在任何时刻都只能有一个警报被排入计划)。 后续的返回值将是任何之前设置的警报被传入之前的秒数。 如果 <em>time</em> 值为零,则不会将任何警报排入计划,并且任何已排入计划的警报都会被取消。 如果返回值为零,则目前没有任何警报被排入计划。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。 更多信息请参见手册页面 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/alarm(2)">alarm(2)</a></em>。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.getsignal">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">getsignal</code><span class="sig-paren">(</span><em class="sig-param">signalnum</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.getsignal" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>返回当前用于信号 <em>signalnum</em> 的信号处理程序。 返回值可以是一个 Python 可调用对象,或是特殊值 <a class="reference internal" href="#signal.SIG_IGN" title="signal.SIG_IGN"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.SIG_IGN</span></code></a>, <a class="reference internal" href="#signal.SIG_DFL" title="signal.SIG_DFL"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.SIG_DFL</span></code></a> 或 <a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal notranslate"><span class="pre">None</span></code></a> 之一。 在这里,<a class="reference internal" href="#signal.SIG_IGN" title="signal.SIG_IGN"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.SIG_IGN</span></code></a> 表示信号在之前被忽略,<a class="reference internal" href="#signal.SIG_DFL" title="signal.SIG_DFL"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.SIG_DFL</span></code></a> 表示之前在使用默认的信号处理方式,而 <code class="docutils literal notranslate"><span class="pre">None</span></code> 表示之前的信号处理程序未由 Python 安装。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.strsignal">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">strsignal</code><span class="sig-paren">(</span><em class="sig-param">signalnum</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.strsignal" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>返回信号 <em>signalnum</em> 的系统描述,例如 "Interrupt", "Segmentation fault" 等等。 如果信号无法被识别则返回 <a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal notranslate"><span class="pre">None</span></code></a>。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.8 新版功能.</span></p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.valid_signals">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">valid_signals</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#signal.valid_signals" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>返回本平台上的有效信号编号集。 这可能会少于 <code class="docutils literal notranslate"><span class="pre">range(1,</span> <span class="pre">NSIG)</span></code>,如果某些信号被系统保留作为内部使用的话。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.8 新版功能.</span></p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.pause">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">pause</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#signal.pause" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>使进程休眠直至接收到一个信号;然后将会调用适当的处理程序。 返回空值。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。 更多信息请参见手册页面 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/signal(2)">signal(2)</a></em>。</p>
|
||
<p>另请参阅 <a class="reference internal" href="#signal.sigwait" title="signal.sigwait"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigwait()</span></code></a>, <a class="reference internal" href="#signal.sigwaitinfo" title="signal.sigwaitinfo"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigwaitinfo()</span></code></a>, <a class="reference internal" href="#signal.sigtimedwait" title="signal.sigtimedwait"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigtimedwait()</span></code></a> 和 <a class="reference internal" href="#signal.sigpending" title="signal.sigpending"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigpending()</span></code></a>。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.raise_signal">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">raise_signal</code><span class="sig-paren">(</span><em class="sig-param">signum</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.raise_signal" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>向调用方进程发送一个信号。 返回空值。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.8 新版功能.</span></p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.pthread_kill">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">pthread_kill</code><span class="sig-paren">(</span><em class="sig-param">thread_id</em>, <em class="sig-param">signalnum</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.pthread_kill" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>Send the signal <em>signalnum</em> to the thread <em>thread_id</em>, another thread in the
|
||
same process as the caller. The target thread can be executing any code
|
||
(Python or not). However, if the target thread is executing the Python
|
||
interpreter, the Python signal handlers will be <a class="reference internal" href="#signals-and-threads"><span class="std std-ref">executed by the main
|
||
thread</span></a>. Therefore, the only point of sending a
|
||
signal to a particular Python thread would be to force a running system call
|
||
to fail with <a class="reference internal" href="exceptions.html#InterruptedError" title="InterruptedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">InterruptedError</span></code></a>.</p>
|
||
<p>使用 <a class="reference internal" href="threading.html#threading.get_ident" title="threading.get_ident"><code class="xref py py-func docutils literal notranslate"><span class="pre">threading.get_ident()</span></code></a> 或 <a class="reference internal" href="threading.html#threading.Thread" title="threading.Thread"><code class="xref py py-class docutils literal notranslate"><span class="pre">threading.Thread</span></code></a> 对象的 <a class="reference internal" href="threading.html#threading.Thread.ident" title="threading.Thread.ident"><code class="xref py py-attr docutils literal notranslate"><span class="pre">ident</span></code></a> 属性为 <em>thread_id</em> 获取合适的值。</p>
|
||
<p>如果 <em>signalnum</em> 为 0,则不会发送信号,但仍然会执行错误检测;这可被用来检测目标线程是否仍在运行。</p>
|
||
<p class="audit-hook">引发一个 <a class="reference internal" href="sys.html#auditing"><span class="std std-ref">审计事件</span></a> <code class="docutils literal notranslate"><span class="pre">signal.pthread_kill</span></code> 并附带参数 <code class="docutils literal notranslate"><span class="pre">thread_id</span></code>, <code class="docutils literal notranslate"><span class="pre">signalnum</span></code>。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。 更多信息请参见手册页面 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/pthread_kill(3)">pthread_kill(3)</a></em>。</p>
|
||
<p>另请参阅 <a class="reference internal" href="os.html#os.kill" title="os.kill"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.kill()</span></code></a>。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.3 新版功能.</span></p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.pthread_sigmask">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">pthread_sigmask</code><span class="sig-paren">(</span><em class="sig-param">how</em>, <em class="sig-param">mask</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.pthread_sigmask" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>获取和/或修改调用方线程的信号掩码。 信号掩码是一组传送过程目前为调用者而阻塞的信号集。 返回旧的信号掩码作为一组信号。</p>
|
||
<p>该调用的行为取决于 <em>how</em> 的值,具体见下。</p>
|
||
<ul class="simple">
|
||
<li><p><a class="reference internal" href="#signal.SIG_BLOCK" title="signal.SIG_BLOCK"><code class="xref py py-data docutils literal notranslate"><span class="pre">SIG_BLOCK</span></code></a>: 被阻塞信号集是当前集与 <em>mask</em> 参数的并集。</p></li>
|
||
<li><p><a class="reference internal" href="#signal.SIG_UNBLOCK" title="signal.SIG_UNBLOCK"><code class="xref py py-data docutils literal notranslate"><span class="pre">SIG_UNBLOCK</span></code></a>: <em>mask</em> 中的信号会从当前已阻塞信号集中被移除。 允许尝试取消对一个非阻塞信号的阻塞。</p></li>
|
||
<li><p><a class="reference internal" href="#signal.SIG_SETMASK" title="signal.SIG_SETMASK"><code class="xref py py-data docutils literal notranslate"><span class="pre">SIG_SETMASK</span></code></a>: 已阻塞信号集会被设为 <em>mask</em> 参数的值。</p></li>
|
||
</ul>
|
||
<p><em>mask</em> 是一个信号编号集合 (例如 {<a class="reference internal" href="#signal.SIGINT" title="signal.SIGINT"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.SIGINT</span></code></a>, <a class="reference internal" href="#signal.SIGTERM" title="signal.SIGTERM"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.SIGTERM</span></code></a>})。 请使用 <a class="reference internal" href="#signal.valid_signals" title="signal.valid_signals"><code class="xref py py-func docutils literal notranslate"><span class="pre">valid_signals()</span></code></a> 表示包含所有信号的完全掩码。</p>
|
||
<p>例如,<code class="docutils literal notranslate"><span class="pre">signal.pthread_sigmask(signal.SIG_BLOCK,</span> <span class="pre">[])</span></code> 会读取调用方线程的信号掩码。</p>
|
||
<p><a class="reference internal" href="#signal.SIGKILL" title="signal.SIGKILL"><code class="xref py py-data docutils literal notranslate"><span class="pre">SIGKILL</span></code></a> 和 <code class="xref py py-data docutils literal notranslate"><span class="pre">SIGSTOP</span></code> 不能被阻塞。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。 更多信息请参见手册页面 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/sigprocmask(3)">sigprocmask(3)</a></em> 和 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/pthread_sigmask(3)">pthread_sigmask(3)</a></em>。</p>
|
||
<p>另请参阅 <a class="reference internal" href="#signal.pause" title="signal.pause"><code class="xref py py-func docutils literal notranslate"><span class="pre">pause()</span></code></a>, <a class="reference internal" href="#signal.sigpending" title="signal.sigpending"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigpending()</span></code></a> 和 <a class="reference internal" href="#signal.sigwait" title="signal.sigwait"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigwait()</span></code></a>。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.3 新版功能.</span></p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.setitimer">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">setitimer</code><span class="sig-paren">(</span><em class="sig-param">which</em>, <em class="sig-param">seconds</em>, <em class="sig-param">interval=0.0</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.setitimer" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>设置由 <em>which</em> 指明的给定间隔计时器 (<a class="reference internal" href="#signal.ITIMER_REAL" title="signal.ITIMER_REAL"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.ITIMER_REAL</span></code></a>, <a class="reference internal" href="#signal.ITIMER_VIRTUAL" title="signal.ITIMER_VIRTUAL"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.ITIMER_VIRTUAL</span></code></a> 或 <a class="reference internal" href="#signal.ITIMER_PROF" title="signal.ITIMER_PROF"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.ITIMER_PROF</span></code></a> 之一) 在 <em>seconds</em> 秒 (接受浮点数值,为与 <a class="reference internal" href="#signal.alarm" title="signal.alarm"><code class="xref py py-func docutils literal notranslate"><span class="pre">alarm()</span></code></a> 之差) 之后开始并在每 <em>interval</em> 秒间隔时 (如果 <em>interval</em> 不为零) 启动。 由 <em>which</em> 指明的间隔计时器可通过将 <em>seconds</em> 设为零来清空。</p>
|
||
<p>当一个间隔计时器启动时,会有信号发送至进程。 所发送的具体信号取决于所使用的计时器;<a class="reference internal" href="#signal.ITIMER_REAL" title="signal.ITIMER_REAL"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.ITIMER_REAL</span></code></a> 将发送 <a class="reference internal" href="#signal.SIGALRM" title="signal.SIGALRM"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGALRM</span></code></a>, <a class="reference internal" href="#signal.ITIMER_VIRTUAL" title="signal.ITIMER_VIRTUAL"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.ITIMER_VIRTUAL</span></code></a> 将发送 <code class="xref py py-const docutils literal notranslate"><span class="pre">SIGVTALRM</span></code>, 而 <a class="reference internal" href="#signal.ITIMER_PROF" title="signal.ITIMER_PROF"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.ITIMER_PROF</span></code></a> 将发送 <code class="xref py py-const docutils literal notranslate"><span class="pre">SIGPROF</span></code>.</p>
|
||
<p>原有的值会以元组: (delay, interval) 的形式被返回。</p>
|
||
<p>尝试传入无效的计时器将导致 <a class="reference internal" href="#signal.ItimerError" title="signal.ItimerError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ItimerError</span></code></a>。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.getitimer">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">getitimer</code><span class="sig-paren">(</span><em class="sig-param">which</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.getitimer" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>返回由 <em>which</em> 指明的给定间隔计时器当前的值。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.set_wakeup_fd">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">set_wakeup_fd</code><span class="sig-paren">(</span><em class="sig-param">fd</em>, <em class="sig-param">*</em>, <em class="sig-param">warn_on_full_buffer=True</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.set_wakeup_fd" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>将唤醒文件描述符设为 <em>fd</em>。 当接收到信号时,会将信号编号以单个字节的形式写入 fd。 这可被其它库用来唤醒一次 poll 或 select 调用,以允许该信号被完全地处理。</p>
|
||
<p>原有的唤醒 fd 会被返回(或者如果未启用文件描述符唤醒则返回 -1)。 如果 <em>fd</em> 为 -1,文件描述符唤醒会被禁用。 如果不为 -1,则 <em>fd</em> 必须为非阻塞型。 需要由库来负责在重新调用 poll 或 select 之前从 <em>fd</em> 移除任何字节数据。</p>
|
||
<p>When threads are enabled, this function can only be called from the main thread;
|
||
attempting to call it from other threads will cause a <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a>
|
||
exception to be raised.</p>
|
||
<p>使用此函数有两种通常的方式。 在两种方式下,当有信号到达时你都是用 fd 来唤醒,但之后它们在确定达到的一个或多个信号 <em>which</em> 时存在差异。</p>
|
||
<p>在第一种方式下,我们从 fd 的缓冲区读取数据,这些字节值会给你信号编号。 这种方式很简单,但在少数情况下会发生问题:通常 fd 将有缓冲区空间大小限制,如果信号到达得太多且太快,缓冲区可能会爆满,有些信号可能丢失。 如果你使用此方式,则你应当设置 <code class="docutils literal notranslate"><span class="pre">warn_on_full_buffer=True</span></code>,当信号丢失时这至少能将警告消息打印到 stderr。</p>
|
||
<p>在第二种方式下,我们 <em>只会</em> 将唤醒 fd 用于唤醒,而忽略实际的字节值。 在此情况下,我们所关心的只有 fd 的缓冲区为空还是不为空;爆满的缓冲区完全不会导致问题。 如果你使用此方式,则你应当设置 <code class="docutils literal notranslate"><span class="pre">warn_on_full_buffer=False</span></code>,这样你的用户就不会被虚假的警告消息所迷惑。</p>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.5 版更改: </span>在 Windows 上,此函数现在也支持套接字处理。</p>
|
||
</div>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.7 版更改: </span>添加了 <code class="docutils literal notranslate"><span class="pre">warn_on_full_buffer</span></code> 形参。</p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.siginterrupt">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">siginterrupt</code><span class="sig-paren">(</span><em class="sig-param">signalnum</em>, <em class="sig-param">flag</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.siginterrupt" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>更改系统调用重启行为:如果 <em>flag</em> 为 <a class="reference internal" href="constants.html#False" title="False"><code class="xref py py-const docutils literal notranslate"><span class="pre">False</span></code></a>,系统调用将在被信号 <em>signalnum</em> 中断时重启,否则系统调用将被中断。 返回空值。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。 更多信息请参见手册页面 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/siginterrupt(3)">siginterrupt(3)</a></em>。</p>
|
||
<p>请注意用 <a class="reference internal" href="#module-signal" title="signal: Set handlers for asynchronous events."><code class="xref py py-func docutils literal notranslate"><span class="pre">signal()</span></code></a> 安装信号处理程序将重启行为重置为可通过显式调用 <code class="xref c c-func docutils literal notranslate"><span class="pre">siginterrupt()</span></code> 并为给定信号的 <em>flag</em> 设置真值来实现中断。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.signal">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">signal</code><span class="sig-paren">(</span><em class="sig-param">signalnum</em>, <em class="sig-param">handler</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.signal" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>将信号 <em>signalnum</em> 的处理程序设为函数 <em>handler</em>。 <em>handler</em> 可以为接受两个参数(见下)的 Python 可调用对象,或者为特殊值 <a class="reference internal" href="#signal.SIG_IGN" title="signal.SIG_IGN"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.SIG_IGN</span></code></a> 或 <a class="reference internal" href="#signal.SIG_DFL" title="signal.SIG_DFL"><code class="xref py py-const docutils literal notranslate"><span class="pre">signal.SIG_DFL</span></code></a> 之一。 之前的信号处理程序将被返回(参见上文 <a class="reference internal" href="#signal.getsignal" title="signal.getsignal"><code class="xref py py-func docutils literal notranslate"><span class="pre">getsignal()</span></code></a> 的描述)。 (更多信息请参阅 Unix 手册页面 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/signal(2)">signal(2)</a></em>。)</p>
|
||
<p>When threads are enabled, this function can only be called from the main thread;
|
||
attempting to call it from other threads will cause a <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a>
|
||
exception to be raised.</p>
|
||
<p><em>handler</em> 将附带两个参数调用:信号编号和当前堆栈帧 (<code class="docutils literal notranslate"><span class="pre">None</span></code> 或一个帧对象;有关帧对象的描述请参阅 <a class="reference internal" href="../reference/datamodel.html#frame-objects"><span class="std std-ref">类型层级结构描述</span></a> 或者参阅 <a class="reference internal" href="inspect.html#module-inspect" title="inspect: Extract information and source code from live objects."><code class="xref py py-mod docutils literal notranslate"><span class="pre">inspect</span></code></a> 模块中的属性描述)。</p>
|
||
<p>在 Windows 上,<a class="reference internal" href="#module-signal" title="signal: Set handlers for asynchronous events."><code class="xref py py-func docutils literal notranslate"><span class="pre">signal()</span></code></a> 调用只能附带 <a class="reference internal" href="#signal.SIGABRT" title="signal.SIGABRT"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGABRT</span></code></a>, <a class="reference internal" href="#signal.SIGFPE" title="signal.SIGFPE"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGFPE</span></code></a>, <a class="reference internal" href="#signal.SIGILL" title="signal.SIGILL"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGILL</span></code></a>, <a class="reference internal" href="#signal.SIGINT" title="signal.SIGINT"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGINT</span></code></a>, <a class="reference internal" href="#signal.SIGSEGV" title="signal.SIGSEGV"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGSEGV</span></code></a>, <a class="reference internal" href="#signal.SIGTERM" title="signal.SIGTERM"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGTERM</span></code></a> 或 <a class="reference internal" href="#signal.SIGBREAK" title="signal.SIGBREAK"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGBREAK</span></code></a>。 任何其他值都将引发 <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a>。 请注意不是所有系统都定义了同样的信号名称集合;如果一个信号名称未被定义为 <code class="docutils literal notranslate"><span class="pre">SIG*</span></code> 模块层级常量则将引发 <a class="reference internal" href="exceptions.html#AttributeError" title="AttributeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">AttributeError</span></code></a>。</p>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.sigpending">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">sigpending</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#signal.sigpending" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>检查正在等待传送给调用方线程的信号集合(即在阻塞期间被引发的信号)。 返回正在等待的信号集合。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。 更多信息请参见手册页面 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/sigpending(2)">sigpending(2)</a></em>。</p>
|
||
<p>另请参阅 <a class="reference internal" href="#signal.pause" title="signal.pause"><code class="xref py py-func docutils literal notranslate"><span class="pre">pause()</span></code></a>, <a class="reference internal" href="#signal.pthread_sigmask" title="signal.pthread_sigmask"><code class="xref py py-func docutils literal notranslate"><span class="pre">pthread_sigmask()</span></code></a> 和 <a class="reference internal" href="#signal.sigwait" title="signal.sigwait"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigwait()</span></code></a>。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.3 新版功能.</span></p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.sigwait">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">sigwait</code><span class="sig-paren">(</span><em class="sig-param">sigset</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.sigwait" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>挂起调用方线程的执行直到信号集合 <em>sigset</em> 中指定的信号之一被传送。 此函数会接受该信号(将其从等待信号列表中移除),并返回信号编号。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。 更多信息请参见手册页面 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/sigwait(3)">sigwait(3)</a></em>。</p>
|
||
<p>另请参阅 <a class="reference internal" href="#signal.pause" title="signal.pause"><code class="xref py py-func docutils literal notranslate"><span class="pre">pause()</span></code></a>, <a class="reference internal" href="#signal.pthread_sigmask" title="signal.pthread_sigmask"><code class="xref py py-func docutils literal notranslate"><span class="pre">pthread_sigmask()</span></code></a>, <a class="reference internal" href="#signal.sigpending" title="signal.sigpending"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigpending()</span></code></a>, <a class="reference internal" href="#signal.sigwaitinfo" title="signal.sigwaitinfo"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigwaitinfo()</span></code></a> 和 <a class="reference internal" href="#signal.sigtimedwait" title="signal.sigtimedwait"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigtimedwait()</span></code></a>。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.3 新版功能.</span></p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.sigwaitinfo">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">sigwaitinfo</code><span class="sig-paren">(</span><em class="sig-param">sigset</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.sigwaitinfo" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>挂起调用方线程的执行直到信号集合 <em>sigset</em> 中指定的信号之一被传送。 此函数会接受该信号并将其从等待信号列表中移除。 如果 <em>sigset</em> 中的信号之一已经在等待调用方线程,此函数将立即返回并附带有关该信号的信息。 被传送信号的信号处理程序不会被调用。 如果该函数被某个不在 <em>sigset</em> 中的信号中断则会引发 <a class="reference internal" href="exceptions.html#InterruptedError" title="InterruptedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">InterruptedError</span></code></a>。</p>
|
||
<p>返回值是一个代表 <code class="xref c c-type docutils literal notranslate"><span class="pre">siginfo_t</span></code> 结构体所包含数据的对象,具体为: <code class="xref py py-attr docutils literal notranslate"><span class="pre">si_signo</span></code>, <code class="xref py py-attr docutils literal notranslate"><span class="pre">si_code</span></code>, <code class="xref py py-attr docutils literal notranslate"><span class="pre">si_errno</span></code>, <code class="xref py py-attr docutils literal notranslate"><span class="pre">si_pid</span></code>, <code class="xref py py-attr docutils literal notranslate"><span class="pre">si_uid</span></code>, <code class="xref py py-attr docutils literal notranslate"><span class="pre">si_status</span></code>, <code class="xref py py-attr docutils literal notranslate"><span class="pre">si_band</span></code>。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。 更多信息请参见手册页面 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/sigwaitinfo(2)">sigwaitinfo(2)</a></em>。</p>
|
||
<p>另请参阅 <a class="reference internal" href="#signal.pause" title="signal.pause"><code class="xref py py-func docutils literal notranslate"><span class="pre">pause()</span></code></a>, <a class="reference internal" href="#signal.sigwait" title="signal.sigwait"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigwait()</span></code></a> 和 <a class="reference internal" href="#signal.sigtimedwait" title="signal.sigtimedwait"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigtimedwait()</span></code></a>。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.3 新版功能.</span></p>
|
||
</div>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.5 版更改: </span>当被某个 不在 <em>sigset</em> 中的信号中断时本函数将进行重试并且信号处理程序不会引发异常(请参阅 <span class="target" id="index-4"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0475"><strong>PEP 475</strong></a> 了解其理由)。</p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
<dl class="function">
|
||
<dt id="signal.sigtimedwait">
|
||
<code class="sig-prename descclassname">signal.</code><code class="sig-name descname">sigtimedwait</code><span class="sig-paren">(</span><em class="sig-param">sigset</em>, <em class="sig-param">timeout</em><span class="sig-paren">)</span><a class="headerlink" href="#signal.sigtimedwait" title="永久链接至目标">¶</a></dt>
|
||
<dd><p>类似于 <a class="reference internal" href="#signal.sigwaitinfo" title="signal.sigwaitinfo"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigwaitinfo()</span></code></a>,但会接受一个额外的 <em>timeout</em> 参数来指定超时限制。 如果将 <em>timeout</em> 指定为 <code class="xref py py-const docutils literal notranslate"><span class="pre">0</span></code>,则会执行轮询。 如果发生超时则返回 <a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal notranslate"><span class="pre">None</span></code></a>。</p>
|
||
<p class="availability"><a class="reference internal" href="intro.html#availability"><span class="std std-ref">可用性</span></a>: Unix。 更多信息请参见手册页面 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/sigtimedwait(2)">sigtimedwait(2)</a></em>。</p>
|
||
<p>另请参阅 <a class="reference internal" href="#signal.pause" title="signal.pause"><code class="xref py py-func docutils literal notranslate"><span class="pre">pause()</span></code></a>, <a class="reference internal" href="#signal.sigwait" title="signal.sigwait"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigwait()</span></code></a> 和 <a class="reference internal" href="#signal.sigwaitinfo" title="signal.sigwaitinfo"><code class="xref py py-func docutils literal notranslate"><span class="pre">sigwaitinfo()</span></code></a>。</p>
|
||
<div class="versionadded">
|
||
<p><span class="versionmodified added">3.3 新版功能.</span></p>
|
||
</div>
|
||
<div class="versionchanged">
|
||
<p><span class="versionmodified changed">在 3.5 版更改: </span>现在当此函数被某个不在 <em>sigset</em> 中的信号中断时将以计算出的 <em>timeout</em> 进行重试并且信号处理程序不会引发异常(请参阅 <span class="target" id="index-5"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0475"><strong>PEP 475</strong></a> 了解其理由)。</p>
|
||
</div>
|
||
</dd></dl>
|
||
|
||
</section>
|
||
<section id="example">
|
||
<span id="signal-example"></span><h2>示例<a class="headerlink" href="#example" title="永久链接至标题">¶</a></h2>
|
||
<p>这是一个最小示例程序。 它使用 <a class="reference internal" href="#signal.alarm" title="signal.alarm"><code class="xref py py-func docutils literal notranslate"><span class="pre">alarm()</span></code></a> 函数来限制等待打开一个文件所花费的时间;这在文件为无法开启的串行设备时会很有用处,此情况通常会导致 <a class="reference internal" href="os.html#os.open" title="os.open"><code class="xref py py-func docutils literal notranslate"><span class="pre">os.open()</span></code></a> 无限期地挂起。 解决办法是在打开文件之前设置 5 秒钟的 alarm;如果操作耗时过长,将会发送 alarm 信号,并且处理程序会引发一个异常。</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">signal</span><span class="o">,</span> <span class="nn">os</span>
|
||
|
||
<span class="k">def</span> <span class="nf">handler</span><span class="p">(</span><span class="n">signum</span><span class="p">,</span> <span class="n">frame</span><span class="p">):</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s1">'Signal handler called with signal'</span><span class="p">,</span> <span class="n">signum</span><span class="p">)</span>
|
||
<span class="k">raise</span> <span class="ne">OSError</span><span class="p">(</span><span class="s2">"Couldn't open device!"</span><span class="p">)</span>
|
||
|
||
<span class="c1"># Set the signal handler and a 5-second alarm</span>
|
||
<span class="n">signal</span><span class="o">.</span><span class="n">signal</span><span class="p">(</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">handler</span><span class="p">)</span>
|
||
<span class="n">signal</span><span class="o">.</span><span class="n">alarm</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
|
||
|
||
<span class="c1"># This open() may hang indefinitely</span>
|
||
<span class="n">fd</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">'/dev/ttyS0'</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">O_RDWR</span><span class="p">)</span>
|
||
|
||
<span class="n">signal</span><span class="o">.</span><span class="n">alarm</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="c1"># Disable the alarm</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="note-on-sigpipe">
|
||
<h2>对于 SIGPIPE 的说明<a class="headerlink" href="#note-on-sigpipe" title="永久链接至标题">¶</a></h2>
|
||
<p>将你的程序用管道输出到工具例如 <em class="manpage"><a class="manpage reference external" href="https://manpages.debian.org/head(1)">head(1)</a></em> 将会导致 <a class="reference internal" href="#signal.SIGPIPE" title="signal.SIGPIPE"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGPIPE</span></code></a> 信号在其标准输出的接收方提前关闭时被发送到你的进程。 这将引发一个异常例如 <code class="code docutils literal notranslate"><span class="pre">BrokenPipeError:</span> <span class="pre">[Errno</span> <span class="pre">32]</span> <span class="pre">Broken</span> <span class="pre">pipe</span></code>。 要处理这种情况,请对你的入口点进行包装以捕获此异常,如下所示:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
|
||
<span class="kn">import</span> <span class="nn">sys</span>
|
||
|
||
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="c1"># simulate large output (your code replaces this loop)</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10000</span><span class="p">):</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"y"</span><span class="p">)</span>
|
||
<span class="c1"># flush output here to force SIGPIPE to be triggered</span>
|
||
<span class="c1"># while inside this try block.</span>
|
||
<span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
|
||
<span class="k">except</span> <span class="ne">BrokenPipeError</span><span class="p">:</span>
|
||
<span class="c1"># Python flushes standard streams on exit; redirect remaining output</span>
|
||
<span class="c1"># to devnull to avoid another BrokenPipeError at shutdown</span>
|
||
<span class="n">devnull</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">devnull</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">O_WRONLY</span><span class="p">)</span>
|
||
<span class="n">os</span><span class="o">.</span><span class="n">dup2</span><span class="p">(</span><span class="n">devnull</span><span class="p">,</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">fileno</span><span class="p">())</span>
|
||
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="c1"># Python exits with error code 1 on EPIPE</span>
|
||
|
||
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
|
||
<span class="n">main</span><span class="p">()</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>不要将 <a class="reference internal" href="#signal.SIGPIPE" title="signal.SIGPIPE"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIGPIPE</span></code></a> 的处置方式设为 <a class="reference internal" href="#signal.SIG_DFL" title="signal.SIG_DFL"><code class="xref py py-const docutils literal notranslate"><span class="pre">SIG_DFL</span></code></a> 以避免 <a class="reference internal" href="exceptions.html#BrokenPipeError" title="BrokenPipeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">BrokenPipeError</span></code></a>。 这样做还会在你的程序所写入的任何套接字连接中断时导致你的程序异常退出。</p>
|
||
</section>
|
||
</section>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||
<div class="sphinxsidebarwrapper">
|
||
<h3><a href="../contents.html">目录</a></h3>
|
||
<ul>
|
||
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">signal</span></code> --- 设置异步事件处理程序</a><ul>
|
||
<li><a class="reference internal" href="#general-rules">一般规则</a><ul>
|
||
<li><a class="reference internal" href="#execution-of-python-signal-handlers">执行 Python 信号处理程序</a></li>
|
||
<li><a class="reference internal" href="#signals-and-threads">信号与线程</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#module-contents">模块内容</a></li>
|
||
<li><a class="reference internal" href="#example">示例</a></li>
|
||
<li><a class="reference internal" href="#note-on-sigpipe">对于 SIGPIPE 的说明</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
<h4>上一个主题</h4>
|
||
<p class="topless"><a href="asynchat.html"
|
||
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">asynchat</span></code> --- 异步套接字指令/响应处理程序</a></p>
|
||
<h4>下一个主题</h4>
|
||
<p class="topless"><a href="mmap.html"
|
||
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">mmap</span></code> --- 内存映射文件支持</a></p>
|
||
<div role="note" aria-label="source link">
|
||
<h3>本页</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="../bugs.html">报告 Bug</a></li>
|
||
<li>
|
||
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/signal.rst"
|
||
rel="nofollow">显示源代码
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="clearer"></div>
|
||
</div>
|
||
<div class="related" role="navigation" aria-label="related navigation">
|
||
<h3>导航</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="../genindex.html" title="总目录"
|
||
>索引</a></li>
|
||
<li class="right" >
|
||
<a href="../py-modindex.html" title="Python 模块索引"
|
||
>模块</a> |</li>
|
||
<li class="right" >
|
||
<a href="mmap.html" title="mmap --- 内存映射文件支持"
|
||
>下一页</a> |</li>
|
||
<li class="right" >
|
||
<a href="asynchat.html" title="asynchat --- 异步套接字指令/响应处理程序"
|
||
>上一页</a> |</li>
|
||
|
||
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
|
||
<li><a href="https://www.python.org/">Python</a> »</li>
|
||
<li class="switchers">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<div class="version_switcher_placeholder"></div>
|
||
</li>
|
||
<li>
|
||
|
||
</li>
|
||
<li id="cpython-language-and-version">
|
||
<a href="../index.html">3.8.20 Documentation</a> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> »</li>
|
||
<li class="nav-item nav-item-2"><a href="ipc.html" >网络和进程间通信</a> »</li>
|
||
<li class="right">
|
||
|
||
|
||
<div class="inline-search" role="search">
|
||
<form class="inline-search" action="../search.html" method="get">
|
||
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
|
||
<input type="submit" value="转向" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
|
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
<div class="footer">
|
||
© <a href="../copyright.html">版权所有</a> 2001-2024, Python Software Foundation.
|
||
<br />
|
||
This page is licensed under the Python Software Foundation License Version 2.
|
||
<br />
|
||
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
|
||
<br />
|
||
|
||
<br />
|
||
|
||
The Python Software Foundation is a non-profit corporation.
|
||
<a href="https://www.python.org/psf/donations/">Please donate.</a>
|
||
<br />
|
||
<br />
|
||
|
||
最后更新于 12月 09, 2024.
|
||
<a href="https://docs.python.org/3/bugs.html">Found a bug</a>?
|
||
<br />
|
||
|
||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 2.4.4.
|
||
</div>
|
||
|
||
</body>
|
||
</html> |