mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 15:04:05 +08:00
1 line
55 KiB
HTML
1 line
55 KiB
HTML
<div class="body" role="main"><div class="section" id="module-select"><h1><span class="yiyi-st" id="yiyi-10">18.3. <a class="reference internal" href="#module-select" title="select: Wait for I/O completion on multiple streams."><code class="xref py py-mod docutils literal"><span class="pre">select</span></code></a> - 等待I / O完成</span></h1><p><span class="yiyi-st" id="yiyi-11">This module provides access to the <code class="xref c c-func docutils literal"><span class="pre">select()</span></code> and <code class="xref c c-func docutils literal"><span class="pre">poll()</span></code> functions available in most operating systems, <code class="xref c c-func docutils literal"><span class="pre">devpoll()</span></code> available on Solaris and derivatives, <code class="xref c c-func docutils literal"><span class="pre">epoll()</span></code> available on Linux 2.5+ and <code class="xref c c-func docutils literal"><span class="pre">kqueue()</span></code> available on most BSD. </span><span class="yiyi-st" id="yiyi-12">注意,在Windows上,它只适用于套接字;在其他操作系统上,它也适用于其他文件类型(特别是在Unix上,它在管道上工作)。</span><span class="yiyi-st" id="yiyi-13">它不能用于常规文件,以确定文件自上次读取以来是否已增长。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-14">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-15"><a class="reference internal" href="selectors.html#module-selectors" title="selectors: High-level I/O multiplexing."><code class="xref py py-mod docutils literal"><span class="pre">selectors</span></code></a>模块允许基于<a class="reference internal" href="#module-select" title="select: Wait for I/O completion on multiple streams."><code class="xref py py-mod docutils literal"><span class="pre">select</span></code></a>模块原语构建的高级和高效的I / O复用。</span><span class="yiyi-st" id="yiyi-16">建议用户使用<a class="reference internal" href="selectors.html#module-selectors" title="selectors: High-level I/O multiplexing."><code class="xref py py-mod docutils literal"><span class="pre">selectors</span></code></a>模块,除非他们需要精确控制所使用的操作系统级原语。</span></p></div><p><span class="yiyi-st" id="yiyi-17">模块定义如下:</span></p><dl class="exception"><dt id="select.error"><span class="yiyi-st" id="yiyi-18"> <em class="property">exception </em><code class="descclassname">select.</code><code class="descname">error</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-19">已弃用的<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a>别名。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-20"><span class="versionmodified">在版本3.3中已更改:</span>在<span class="target" id="index-0"></span> <a class="pep reference external" href="https://www.python.org/dev/peps/pep-3151"><strong>PEP 3151</strong></a>之后,此类被设为<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a>的别名。</span></p></div></dd></dl><dl class="function"><dt id="select.devpoll"><span class="yiyi-st" id="yiyi-21"> <code class="descclassname">select.</code><code class="descname">devpoll</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-22">(仅在Solaris和衍生产品上受支持。</span><span class="yiyi-st" id="yiyi-23">返回<code class="docutils literal"><span class="pre">/dev/poll</span></code>轮询对象;有关devpoll对象支持的方法,请参阅下面的<a class="reference internal" href="#devpoll-objects"><span>/dev/poll Polling Objects</span></a>一节。</span></p><p><span class="yiyi-st" id="yiyi-24"><code class="xref c c-func docutils literal"><span class="pre">devpoll()</span></code>对象链接到在实例化时允许的文件描述器的数量。</span><span class="yiyi-st" id="yiyi-25">如果你的程序减少这个值,<code class="xref c c-func docutils literal"><span class="pre">devpoll()</span></code>将失败。</span><span class="yiyi-st" id="yiyi-26">如果你的程序增加这个值,<code class="xref c c-func docutils literal"><span class="pre">devpoll()</span></code>可能返回一个不完整的活动文件列表描述器。</span></p><p><span class="yiyi-st" id="yiyi-27">新文件描述器是<a class="reference internal" href="os.html#fd-inheritance"><span>non-inheritable</span></a>。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-28"><span class="versionmodified">版本3.3中的新功能。</span></span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-29"><span class="versionmodified">在版本3.4中更改:</span>新文件描述器现在是不可继承的。</span></p></div></dd></dl><dl class="function"><dt id="select.epoll"><span class="yiyi-st" id="yiyi-30"> <code class="descclassname">select.</code><code class="descname">epoll</code><span class="sig-paren">(</span><em>sizehint=-1</em>, <em>flags=0</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-31">(仅在Linux 2.5.44及更高版本上受支持。)</span><span class="yiyi-st" id="yiyi-32">返回边沿轮询对象,可用作I / O事件的边沿或级别触发接口。</span><span class="yiyi-st" id="yiyi-33"><em>sizehint</em>已被弃用并完全被忽略。</span><span class="yiyi-st" id="yiyi-34"><em>标志</em>可以设置为<code class="xref py py-const docutils literal"><span class="pre">EPOLL_CLOEXEC</span></code>,这将导致在调用<a class="reference internal" href="os.html#os.execve" title="os.execve"><code class="xref py py-func docutils literal"><span class="pre">os.execve()</span></code></a>时epoll描述器自动关闭。</span></p><p><span class="yiyi-st" id="yiyi-35">有关epolling对象支持的方法,请参见下面的<a class="reference internal" href="#epoll-objects"><span>Edge and Level Trigger Polling (epoll) Objects</span></a>部分。</span></p><p><span class="yiyi-st" id="yiyi-36"><code class="docutils literal"><span class="pre">epoll</span></code>对象支持上下文管理协议:当在<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal"><span class="pre">with</span></code></a>语句中使用时,新文件描述器在块结束时自动关闭。</span></p><p><span class="yiyi-st" id="yiyi-37">新文件描述器是<a class="reference internal" href="os.html#fd-inheritance"><span>non-inheritable</span></a>。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-38"><span class="versionmodified">在版本3.3中已更改:</span>添加了<em>标志</em>参数。</span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-39"><span class="versionmodified">在版本3.4中已更改:</span>添加了对<a class="reference internal" href="../reference/compound_stmts.html#with"><code class="xref std std-keyword docutils literal"><span class="pre">with</span></code></a>语句的支持。</span><span class="yiyi-st" id="yiyi-40">新文件描述器现在是不可继承的。</span></p></div></dd></dl><dl class="function"><dt id="select.poll"><span class="yiyi-st" id="yiyi-41"> <code class="descclassname">select.</code><code class="descname">poll</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-42">(不受所有操作系统支持。)</span><span class="yiyi-st" id="yiyi-43">返回一个轮询对象,它支持注册和取消注册文件描述器,然后轮询它们的I / O事件;有关轮询对象支持的方法,请参阅下面的<a class="reference internal" href="#poll-objects"><span>Polling Objects</span></a>部分。</span></p></dd></dl><dl class="function"><dt id="select.kqueue"><span class="yiyi-st" id="yiyi-44"> <code class="descclassname">select.</code><code class="descname">kqueue</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-45">(仅在BSD上支持。</span><span class="yiyi-st" id="yiyi-46">返回一个内核队列对象;有关kqueue对象支持的方法,请参阅下面的<a class="reference internal" href="#kqueue-objects"><span>Kqueue Objects</span></a>部分。</span></p><p><span class="yiyi-st" id="yiyi-47">新文件描述器是<a class="reference internal" href="os.html#fd-inheritance"><span>non-inheritable</span></a>。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-48"><span class="versionmodified">在版本3.4中更改:</span>新文件描述器现在是不可继承的。</span></p></div></dd></dl><dl class="function"><dt id="select.kevent"><span class="yiyi-st" id="yiyi-49"> <code class="descclassname">select.</code><code class="descname">kevent</code><span class="sig-paren">(</span><em>ident</em>, <em>filter=KQ_FILTER_READ</em>, <em>flags=KQ_EV_ADD</em>, <em>fflags=0</em>, <em>data=0</em>, <em>udata=0</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-50">(仅在BSD上支持。</span><span class="yiyi-st" id="yiyi-51">返回内核事件对象;有关kevent对象支持的方法,请参阅下面的<a class="reference internal" href="#kevent-objects"><span>Kevent Objects</span></a>部分。</span></p></dd></dl><dl class="function"><dt id="select.select"><span class="yiyi-st" id="yiyi-52"> <code class="descclassname">select.</code><code class="descname">select</code><span class="sig-paren">(</span><em>rlist</em>, <em>wlist</em>, <em>xlist</em><span class="optional">[</span>, <em>timeout</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-53">这是Unix <code class="xref c c-func docutils literal"><span class="pre">select()</span></code>系统调用的简单接口。</span><span class="yiyi-st" id="yiyi-54">前三个参数是“等待对象”的序列:使用名为<a class="reference internal" href="io.html#io.IOBase.fileno" title="io.IOBase.fileno"><code class="xref py py-meth docutils literal"><span class="pre">fileno()</span></code></a>的无参数方法表示文件描述器或对象的整数返回这样一个整数:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-55"><em>rlist</em>:等待准备读取</span></li><li><span class="yiyi-st" id="yiyi-56"><em>wlist</em>:等待准备写入</span></li><li><span class="yiyi-st" id="yiyi-57"><em>xlist</em>:等待“异常条件”(请参阅系统认为此类条件的手册页)</span></li></ul><p><span class="yiyi-st" id="yiyi-58">允许空序列,但三个空序列的接受是平台依赖性的。</span><span class="yiyi-st" id="yiyi-59">(已知在Unix上工作,但在Windows上不工作。)</span><span class="yiyi-st" id="yiyi-60">可选的<em>timeout</em>参数将超时指定为浮点数,以秒为单位。</span><span class="yiyi-st" id="yiyi-61">当省略<em>timeout</em>参数时,该功能阻塞,直到至少一个文件描述器准备就绪。</span><span class="yiyi-st" id="yiyi-62">超时值零指定轮询并从不阻止。</span></p><p><span class="yiyi-st" id="yiyi-63">返回值是准备好的对象列表的三倍:前三个参数的子集。</span><span class="yiyi-st" id="yiyi-64">当超时到达没有文件描述器变为准备好时,返回三个空列表。</span></p><p id="index-1"><span class="yiyi-st" id="yiyi-65">在序列中可接受的对象类型中有Python <a class="reference internal" href="../glossary.html#term-file-object"><span class="xref std std-term">file objects</span></a>(例如,</span><span class="yiyi-st" id="yiyi-66"><code class="docutils literal"><span class="pre">sys.stdin</span></code>或由<a class="reference internal" href="functions.html#open" title="open"><code class="xref py py-func docutils literal"><span class="pre">open()</span></code></a>或<a class="reference internal" href="os.html#os.popen" title="os.popen"><code class="xref py py-func docutils literal"><span class="pre">os.popen()</span></code></a>返回的对象,<a class="reference internal" href="socket.html#socket.socket" title="socket.socket"><code class="xref py py-func docutils literal"><span class="pre">socket.socket()</span></code></a>。</span><span class="yiyi-st" id="yiyi-67">你也可以自己定义一个<em class="dfn">wrapper</em>类,只要它有一个适当的<a class="reference internal" href="io.html#io.IOBase.fileno" title="io.IOBase.fileno"><code class="xref py py-meth docutils literal"><span class="pre">fileno()</span></code></a>方法(真的返回一个文件描述器,而不只是一个随机整数)。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-68">注意</span></p><p class="last" id="index-2"><span class="yiyi-st" id="yiyi-69">Windows上的文件对象不可接受,但套接字是。</span><span class="yiyi-st" id="yiyi-70">在Windows上,底层的<code class="xref c c-func docutils literal"><span class="pre">select()</span></code>函数由WinSock库提供,不处理不是源自WinSock的文件描述器。</span></p></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-71"><span class="versionmodified">Changed in version 3.5: </span>The function is now retried with a recomputed timeout when interrupted by a signal, except if the signal handler raises an exception (see <span class="target" id="index-3"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0475"><strong>PEP 475</strong></a> for the rationale), instead of raising <a class="reference internal" href="exceptions.html#InterruptedError" title="InterruptedError"><code class="xref py py-exc docutils literal"><span class="pre">InterruptedError</span></code></a>.</span></p></div></dd></dl><dl class="attribute"><dt id="select.PIPE_BUF"><span class="yiyi-st" id="yiyi-72"> <code class="descclassname">select.</code><code class="descname">PIPE_BUF</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-73">当管道已报告为准备写入<a class="reference internal" href="#select.select" title="select.select"><code class="xref py py-func docutils literal"><span class="pre">select()</span></code></a>,<a class="reference internal" href="#select.poll" title="select.poll"><code class="xref py py-func docutils literal"><span class="pre">poll()</span></code></a>或另一个接口时,可以写入的最小字节数而不会阻塞到管道这个模块。</span><span class="yiyi-st" id="yiyi-74">这不适用于其他类型的文件状对象,如套接字。</span></p><p><span class="yiyi-st" id="yiyi-75">此值由POSIX保证至少为512。</span><span class="yiyi-st" id="yiyi-76">可用性:Unix。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-77"><span class="versionmodified">版本3.2中的新功能。</span></span></p></div></dd></dl><div class="section" id="dev-poll-polling-objects"><h2><span class="yiyi-st" id="yiyi-78">18.3.1. </span><span class="yiyi-st" id="yiyi-79"><code class="docutils literal"><span class="pre">/dev/poll</span></code> Polling Objects</span></h2><p><span class="yiyi-st" id="yiyi-80">Solaris和衍生产品具有<code class="docutils literal"><span class="pre">/dev/poll</span></code>。</span><span class="yiyi-st" id="yiyi-81"><code class="xref c c-func docutils literal"><span class="pre">select()</span></code>是O(最高文件描述器),<code class="xref c c-func docutils literal"><span class="pre">poll()</span></code>是O(文件描述器的数目),<code class="docutils literal"><span class="pre">/dev/poll</span></code></span></p><p><span class="yiyi-st" id="yiyi-82"><code class="docutils literal"><span class="pre">/dev/poll</span></code>行为非常接近标准<code class="xref c c-func docutils literal"><span class="pre">poll()</span></code>对象。</span></p><dl class="method"><dt id="select.devpoll.close"><span class="yiyi-st" id="yiyi-83"> <code class="descclassname">devpoll.</code><code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-84">关闭轮询对象的描述器。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-85"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div></dd></dl><dl class="attribute"><dt id="select.devpoll.closed"><span class="yiyi-st" id="yiyi-86"> <code class="descclassname">devpoll.</code><code class="descname">closed</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-87"><code class="docutils literal"><span class="pre">True</span></code>如果轮询对象已关闭。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-88"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div></dd></dl><dl class="method"><dt id="select.devpoll.fileno"><span class="yiyi-st" id="yiyi-89"> <code class="descclassname">devpoll.</code><code class="descname">fileno</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-90">返回轮询对象的描述器号。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-91"><span class="versionmodified">版本3.4中的新功能。</span></span></p></div></dd></dl><dl class="method"><dt id="select.devpoll.register"><span class="yiyi-st" id="yiyi-92"> <code class="descclassname">devpoll.</code><code class="descname">register</code><span class="sig-paren">(</span><em>fd</em><span class="optional">[</span>, <em>eventmask</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-93">注册文件描述器与轮询对象。</span><span class="yiyi-st" id="yiyi-94">对<a class="reference internal" href="#select.poll" title="select.poll"><code class="xref py py-meth docutils literal"><span class="pre">poll()</span></code></a>方法的未来调用将检查文件描述器是否有任何未决的I / O事件。</span><span class="yiyi-st" id="yiyi-95"><em>fd</em>可以是整数,也可以是返回整数的<a class="reference internal" href="io.html#io.IOBase.fileno" title="io.IOBase.fileno"><code class="xref py py-meth docutils literal"><span class="pre">fileno()</span></code></a>方法的对象。</span><span class="yiyi-st" id="yiyi-96">文件对象实现<code class="xref py py-meth docutils literal"><span class="pre">fileno()</span></code>,因此它们也可以用作参数。</span></p><p><span class="yiyi-st" id="yiyi-97"><em>eventmask</em>是描述要检查的事件类型的可选位掩码。</span><span class="yiyi-st" id="yiyi-98">这些常量与<code class="xref c c-func docutils literal"><span class="pre">poll()</span></code>对象的常量相同。</span><span class="yiyi-st" id="yiyi-99">默认值是常量<code class="xref py py-const docutils literal"><span class="pre">POLLIN</span></code>,<code class="xref py py-const docutils literal"><span class="pre">POLLPRI</span></code>和<code class="xref py py-const docutils literal"><span class="pre">POLLOUT</span></code>的组合。</span></p><div class="admonition warning"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-100">警告</span></p><p class="last"><span class="yiyi-st" id="yiyi-101">注册文件已经注册的描述器不是错误,但结果是未定义的。</span><span class="yiyi-st" id="yiyi-102">相应的操作是首先取消注册或修改它。</span><span class="yiyi-st" id="yiyi-103">与<code class="xref c c-func docutils literal"><span class="pre">poll()</span></code>相比,这是一个重要的区别。</span></p></div></dd></dl><dl class="method"><dt id="select.devpoll.modify"><span class="yiyi-st" id="yiyi-104"> <code class="descclassname">devpoll.</code><code class="descname">modify</code><span class="sig-paren">(</span><em>fd</em><span class="optional">[</span>, <em>eventmask</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-105">此方法执行<a class="reference internal" href="#select.devpoll.unregister" title="select.devpoll.unregister"><code class="xref py py-meth docutils literal"><span class="pre">unregister()</span></code></a>后跟<a class="reference internal" href="#select.devpoll.register" title="select.devpoll.register"><code class="xref py py-meth docutils literal"><span class="pre">register()</span></code></a>。</span><span class="yiyi-st" id="yiyi-106">它是(有点)更有效率做同样明确。</span></p></dd></dl><dl class="method"><dt id="select.devpoll.unregister"><span class="yiyi-st" id="yiyi-107"> <code class="descclassname">devpoll.</code><code class="descname">unregister</code><span class="sig-paren">(</span><em>fd</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-108">删除文件描述正在被轮询对象跟踪的器件。</span><span class="yiyi-st" id="yiyi-109">与<a class="reference internal" href="#select.devpoll.register" title="select.devpoll.register"><code class="xref py py-meth docutils literal"><span class="pre">register()</span></code></a>方法一样,<em>fd</em>可以是一个整数,也可以是一个返回整数的<a class="reference internal" href="io.html#io.IOBase.fileno" title="io.IOBase.fileno"><code class="xref py py-meth docutils literal"><span class="pre">fileno()</span></code></a>方法的对象。</span></p><p><span class="yiyi-st" id="yiyi-110">尝试删除文件安全地忽略从未注册的描述器。</span></p></dd></dl><dl class="method"><dt id="select.devpoll.poll"><span class="yiyi-st" id="yiyi-111"> <code class="descclassname">devpoll.</code><code class="descname">poll</code><span class="sig-paren">(</span><span class="optional">[</span><em>timeout</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-112">调用注册文件描述器的集合,并返回一个包含<code class="docutils literal"><span class="pre">(fd,</span> <span class="pre">事件)</span></code>有报告的事件或错误。</span><span class="yiyi-st" id="yiyi-113"><em>fd</em>是文件描述器,<em>事件</em>是一个位掩码,该位掩码为该描述器 - <code class="xref py py-const docutils literal"><span class="pre">POLLIN</span></code> <code class="xref py py-const docutils literal"><span class="pre">POLLOUT</span></code>以指示可以将描述器写入等等。</span><span class="yiyi-st" id="yiyi-114">空列表指示呼叫超时,并且没有文件描述器具有要报告的任何事件。</span><span class="yiyi-st" id="yiyi-115">如果给定<em>timeout</em>,则指定系统在返回之前等待事件的时间长度(以毫秒为单位)。</span><span class="yiyi-st" id="yiyi-116">如果省略<em>timeout</em>,-1或<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>,则调用将阻塞,直到此poll对象有事件为止。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-117"><span class="versionmodified">Changed in version 3.5: </span>The function is now retried with a recomputed timeout when interrupted by a signal, except if the signal handler raises an exception (see <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> for the rationale), instead of raising <a class="reference internal" href="exceptions.html#InterruptedError" title="InterruptedError"><code class="xref py py-exc docutils literal"><span class="pre">InterruptedError</span></code></a>.</span></p></div></dd></dl></div><div class="section" id="edge-and-level-trigger-polling-epoll-objects"><h2><span class="yiyi-st" id="yiyi-118">18.3.2. </span><span class="yiyi-st" id="yiyi-119">Edge and Level Trigger Polling (epoll) Objects</span></h2><span class="yiyi-st" id="yiyi-138"> <blockquote> <div><p><a class="reference external" href="http://linux.die.net/man/4/epoll">http://linux.die.net/man/4/epoll</a></p> <p><em>eventmask</em></p> <table border="1" class="docutils"> <colgroup> <col width="33%"/> <col width="67%"/> </colgroup> <thead valign="bottom"> <tr class="row-odd"><th class="head">Constant</th> <th class="head">Meaning</th> </tr> </thead> <tbody valign="top"> <tr class="row-even"><td><code class="xref py py-const docutils literal"><span class="pre">EPOLLIN</span></code></td> <td>Available for read</td> </tr> <tr class="row-odd"><td><code class="xref py py-const docutils literal"><span class="pre">EPOLLOUT</span></code></td> <td>Available for write</td> </tr> <tr class="row-even"><td><code class="xref py py-const docutils literal"><span class="pre">EPOLLPRI</span></code></td> <td>Urgent data for read</td> </tr> <tr class="row-odd"><td><code class="xref py py-const docutils literal"><span class="pre">EPOLLERR</span></code></td> <td>Error condition happened on the assoc. fd</td> </tr> <tr class="row-even"><td><code class="xref py py-const docutils literal"><span class="pre">EPOLLHUP</span></code></td> <td>Hang up happened on the assoc. fd</td> </tr> <tr class="row-odd"><td><code class="xref py py-const docutils literal"><span class="pre">EPOLLET</span></code></td> <td>Set Edge Trigger behavior, the default is Level Trigger behavior</td> </tr> <tr class="row-even"><td><code class="xref py py-const docutils literal"><span class="pre">EPOLLONESHOT</span></code></td> <td>Set one-shot behavior. After one event is pulled out, the fd is internally disabled</td> </tr> <tr class="row-odd"><td><code class="xref py py-const docutils literal"><span class="pre">EPOLLRDNORM</span></code></td> <td>Equivalent to <code class="xref py py-const docutils literal"><span class="pre">EPOLLIN</span></code></td> </tr> <tr class="row-even"><td><code class="xref py py-const docutils literal"><span class="pre">EPOLLRDBAND</span></code></td> <td>Priority data band can be read.</td> </tr> <tr class="row-odd"><td><code class="xref py py-const docutils literal"><span class="pre">EPOLLWRNORM</span></code></td> <td>Equivalent to <code class="xref py py-const docutils literal"><span class="pre">EPOLLOUT</span></code></td> </tr> <tr class="row-even"><td><code class="xref py py-const docutils literal"><span class="pre">EPOLLWRBAND</span></code></td> <td>Priority data may be written.</td> </tr> <tr class="row-odd"><td><code class="xref py py-const docutils literal"><span class="pre">EPOLLMSG</span></code></td> <td>Ignored.</td> </tr> </tbody> </table> </div></blockquote></span><dl class="method"><dt id="select.epoll.close"><span class="yiyi-st" id="yiyi-120"> <code class="descclassname">epoll.</code><code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-121">关闭epoll对象的控制文件描述器。</span></p></dd></dl><dl class="attribute"><dt id="select.epoll.closed"><span class="yiyi-st" id="yiyi-122"> <code class="descclassname">epoll.</code><code class="descname">closed</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-123"><code class="docutils literal"><span class="pre">True</span></code>如果epoll对象已关闭。</span></p></dd></dl><dl class="method"><dt id="select.epoll.fileno"><span class="yiyi-st" id="yiyi-124"> <code class="descclassname">epoll.</code><code class="descname">fileno</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-125">返回文件描述fd的控件编号。</span></p></dd></dl><dl class="method"><dt id="select.epoll.fromfd"><span class="yiyi-st" id="yiyi-126"> <code class="descclassname">epoll.</code><code class="descname">fromfd</code><span class="sig-paren">(</span><em>fd</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-127">从给定文件创建epoll对象描述器。</span></p></dd></dl><dl class="method"><dt id="select.epoll.register"><span class="yiyi-st" id="yiyi-128"> <code class="descclassname">epoll.</code><code class="descname">register</code><span class="sig-paren">(</span><em>fd</em><span class="optional">[</span>, <em>eventmask</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-129">使用epoll对象注册fd描述器。</span></p></dd></dl><dl class="method"><dt id="select.epoll.modify"><span class="yiyi-st" id="yiyi-130"> <code class="descclassname">epoll.</code><code class="descname">modify</code><span class="sig-paren">(</span><em>fd</em>, <em>eventmask</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-131">修改注册文件描述器。</span></p></dd></dl><dl class="method"><dt id="select.epoll.unregister"><span class="yiyi-st" id="yiyi-132"> <code class="descclassname">epoll.</code><code class="descname">unregister</code><span class="sig-paren">(</span><em>fd</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-133">删除注册文件从epoll对象中描述器件。</span></p></dd></dl><dl class="method"><dt id="select.epoll.poll"><span class="yiyi-st" id="yiyi-134"> <code class="descclassname">epoll.</code><code class="descname">poll</code><span class="sig-paren">(</span><em>timeout=-1</em>, <em>maxevents=-1</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-135">等待事件。</span><span class="yiyi-st" id="yiyi-136">超时秒(float)</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-137"><span class="versionmodified">Changed in version 3.5: </span>The function is now retried with a recomputed timeout when interrupted by a signal, except if the signal handler raises an exception (see <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> for the rationale), instead of raising <a class="reference internal" href="exceptions.html#InterruptedError" title="InterruptedError"><code class="xref py py-exc docutils literal"><span class="pre">InterruptedError</span></code></a>.</span></p></div></dd></dl></div><div class="section" id="polling-objects"><h2><span class="yiyi-st" id="yiyi-139">18.3.3. </span><span class="yiyi-st" id="yiyi-140">Polling Objects</span></h2><p><span class="yiyi-st" id="yiyi-141">在大多数Unix系统上支持的<code class="xref c c-func docutils literal"><span class="pre">poll()</span></code>系统调用为同时为许多客户端提供服务的网络服务器提供了更好的可扩展性。</span><span class="yiyi-st" id="yiyi-142"><code class="xref c c-func docutils literal"><span class="pre">poll()</span></code>更好,因为系统调用只需要列出感兴趣的文件描述器,而<code class="xref c c-func docutils literal"><span class="pre">select()</span></code>构建位图,打开感兴趣的fds的位,然后之后必须再次线性扫描整个位图。</span><span class="yiyi-st" id="yiyi-143"><code class="xref c c-func docutils literal"><span class="pre">select()</span></code>是O(最高文件描述器),而<code class="xref c c-func docutils literal"><span class="pre">poll()</span></code>是O(文件描述器的数目)。</span></p><dl class="method"><dt id="select.poll.register"><span class="yiyi-st" id="yiyi-144"> <code class="descclassname">poll.</code><code class="descname">register</code><span class="sig-paren">(</span><em>fd</em><span class="optional">[</span>, <em>eventmask</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-145">注册文件描述器与轮询对象。</span><span class="yiyi-st" id="yiyi-146">对<a class="reference internal" href="#select.poll" title="select.poll"><code class="xref py py-meth docutils literal"><span class="pre">poll()</span></code></a>方法的未来调用将检查文件描述器是否有任何未决的I / O事件。</span><span class="yiyi-st" id="yiyi-147"><em>fd</em>可以是整数,也可以是返回整数的<a class="reference internal" href="io.html#io.IOBase.fileno" title="io.IOBase.fileno"><code class="xref py py-meth docutils literal"><span class="pre">fileno()</span></code></a>方法的对象。</span><span class="yiyi-st" id="yiyi-148">文件对象实现<code class="xref py py-meth docutils literal"><span class="pre">fileno()</span></code>,因此它们也可以用作参数。</span></p><p><span class="yiyi-st" id="yiyi-149"><em>eventmask</em>是描述要检查的事件类型的可选位掩码,可以是常量<code class="xref py py-const docutils literal"><span class="pre">POLLIN</span></code>,<code class="xref py py-const docutils literal"><span class="pre">POLLPRI</span></code>和<code class="xref py py-const docutils literal"><span class="pre">POLLOUT</span></code>,如下表所述。</span><span class="yiyi-st" id="yiyi-150">如果未指定,则使用的默认值将检查所有3种类型的事件。</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-151">不变</span></th><th class="head"><span class="yiyi-st" id="yiyi-152">含义</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-153"><code class="xref py py-const docutils literal"><span class="pre">POLLIN</span></code></span></td><td><span class="yiyi-st" id="yiyi-154">有要读取的数据</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-155"><code class="xref py py-const docutils literal"><span class="pre">POLLPRI</span></code></span></td><td><span class="yiyi-st" id="yiyi-156">有紧急数据要读</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-157"><code class="xref py py-const docutils literal"><span class="pre">POLLOUT</span></code></span></td><td><span class="yiyi-st" id="yiyi-158">准备输出:写入不会阻塞</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-159"><code class="xref py py-const docutils literal"><span class="pre">POLLERR</span></code></span></td><td><span class="yiyi-st" id="yiyi-160">某种类型的错误条件</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-161"><code class="xref py py-const docutils literal"><span class="pre">POLLHUP</span></code></span></td><td><span class="yiyi-st" id="yiyi-162">挂了</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-163"><code class="xref py py-const docutils literal"><span class="pre">POLLNVAL</span></code></span></td><td><span class="yiyi-st" id="yiyi-164">请求无效:描述器不打开</span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-165">注册文件已经注册的描述器不是错误,并且与注册描述器完全一样的效果。</span></p></dd></dl><dl class="method"><dt id="select.poll.modify"><span class="yiyi-st" id="yiyi-166"> <code class="descclassname">poll.</code><code class="descname">modify</code><span class="sig-paren">(</span><em>fd</em>, <em>eventmask</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-167">修改已注册的fd。</span><span class="yiyi-st" id="yiyi-168">这与<code class="docutils literal"><span class="pre">寄存器(fd,</span> <span class="pre">eventmask)</span></code>具有相同的效果。</span><span class="yiyi-st" id="yiyi-169">尝试修改未曾注册的文件描述器会导致引发具有errno <code class="xref py py-const docutils literal"><span class="pre">ENOENT</span></code>的<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a>异常。</span></p></dd></dl><dl class="method"><dt id="select.poll.unregister"><span class="yiyi-st" id="yiyi-170"> <code class="descclassname">poll.</code><code class="descname">unregister</code><span class="sig-paren">(</span><em>fd</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-171">删除文件描述正在被轮询对象跟踪的器件。</span><span class="yiyi-st" id="yiyi-172">和<a class="reference internal" href="#select.poll.register" title="select.poll.register"><code class="xref py py-meth docutils literal"><span class="pre">register()</span></code></a>方法一样,<em>fd</em>可以是一个整数或一个带有返回整数的<a class="reference internal" href="io.html#io.IOBase.fileno" title="io.IOBase.fileno"><code class="xref py py-meth docutils literal"><span class="pre">fileno()</span></code></a>方法的对象。</span></p><p><span class="yiyi-st" id="yiyi-173">尝试删除文件描述未曾注册的器件会引发<a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal"><span class="pre">KeyError</span></code></a>异常。</span></p></dd></dl><dl class="method"><dt id="select.poll.poll"><span class="yiyi-st" id="yiyi-174"> <code class="descclassname">poll.</code><code class="descname">poll</code><span class="sig-paren">(</span><span class="optional">[</span><em>timeout</em><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-175">调用注册文件描述器的集合,并返回一个包含<code class="docutils literal"><span class="pre">(fd,</span> <span class="pre">事件)</span></code>有报告的事件或错误。</span><span class="yiyi-st" id="yiyi-176"><em>fd</em>是文件描述器,<em>事件</em>是一个位掩码,该位掩码为该描述器 - <code class="xref py py-const docutils literal"><span class="pre">POLLIN</span></code> <code class="xref py py-const docutils literal"><span class="pre">POLLOUT</span></code>以指示可以将描述器写入等等。</span><span class="yiyi-st" id="yiyi-177">空列表指示呼叫超时,并且没有文件描述器具有要报告的任何事件。</span><span class="yiyi-st" id="yiyi-178">如果给定<em>timeout</em>,则指定系统在返回之前等待事件的时间长度(以毫秒为单位)。</span><span class="yiyi-st" id="yiyi-179">如果省略<em>超时</em>,否定或<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>,调用将阻塞,直到此轮询对象有事件。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-180"><span class="versionmodified">Changed in version 3.5: </span>The function is now retried with a recomputed timeout when interrupted by a signal, except if the signal handler raises an exception (see <span class="target" id="index-6"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0475"><strong>PEP 475</strong></a> for the rationale), instead of raising <a class="reference internal" href="exceptions.html#InterruptedError" title="InterruptedError"><code class="xref py py-exc docutils literal"><span class="pre">InterruptedError</span></code></a>.</span></p></div></dd></dl></div><div class="section" id="kqueue-objects"><h2><span class="yiyi-st" id="yiyi-181">18.3.4. </span><span class="yiyi-st" id="yiyi-182">Kqueue Objects</span></h2><dl class="method"><dt id="select.kqueue.close"><span class="yiyi-st" id="yiyi-183"> <code class="descclassname">kqueue.</code><code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-184">关闭kqueue对象的控制文件描述器。</span></p></dd></dl><dl class="attribute"><dt id="select.kqueue.closed"><span class="yiyi-st" id="yiyi-185"> <code class="descclassname">kqueue.</code><code class="descname">closed</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-186"><code class="docutils literal"><span class="pre">True</span></code>如果kqueue对象关闭。</span></p></dd></dl><dl class="method"><dt id="select.kqueue.fileno"><span class="yiyi-st" id="yiyi-187"> <code class="descclassname">kqueue.</code><code class="descname">fileno</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-188">返回文件描述fd的控件编号。</span></p></dd></dl><dl class="method"><dt id="select.kqueue.fromfd"><span class="yiyi-st" id="yiyi-189"> <code class="descclassname">kqueue.</code><code class="descname">fromfd</code><span class="sig-paren">(</span><em>fd</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-190">从给定的文件创建一个kqueue对象描述器。</span></p></dd></dl><dl class="method"><dt id="select.kqueue.control"><span class="yiyi-st" id="yiyi-191"> <code class="descclassname">kqueue.</code><code class="descname">control</code><span class="sig-paren">(</span><em>changelist</em>, <em>max_events</em><span class="optional">[</span>, <em>timeout=None</em><span class="optional">]</span><span class="sig-paren">)</span> → eventlist</span></dt><dd><p><span class="yiyi-st" id="yiyi-192">低级别接口kevent</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-193">changelist必须是一个可迭代的kevent对象或None</span></li><li><span class="yiyi-st" id="yiyi-194">max_events必须为0或正整数</span></li><li><span class="yiyi-st" id="yiyi-195">超时秒(可能是浮动)</span></li></ul><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-196"><span class="versionmodified">Changed in version 3.5: </span>The function is now retried with a recomputed timeout when interrupted by a signal, except if the signal handler raises an exception (see <span class="target" id="index-7"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0475"><strong>PEP 475</strong></a> for the rationale), instead of raising <a class="reference internal" href="exceptions.html#InterruptedError" title="InterruptedError"><code class="xref py py-exc docutils literal"><span class="pre">InterruptedError</span></code></a>.</span></p></div></dd></dl></div><div class="section" id="kevent-objects"><h2><span class="yiyi-st" id="yiyi-197">18.3.5. </span><span class="yiyi-st" id="yiyi-198">Kevent Objects</span></h2><p><span class="yiyi-st" id="yiyi-199"><a class="reference external" href="https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2">https://www.freebsd.org/cgi/man.cgi?query=kqueue&amp;sektion=2</a></span></p><dl class="attribute"><dt id="select.kevent.ident"><span class="yiyi-st" id="yiyi-200"> <code class="descclassname">kevent.</code><code class="descname">ident</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-201">用于标识事件的值。</span><span class="yiyi-st" id="yiyi-202">解释取决于过滤器,但它通常是文件描述器。</span><span class="yiyi-st" id="yiyi-203">在构造函数中,ident可以是一个int或一个具有<a class="reference internal" href="io.html#io.IOBase.fileno" title="io.IOBase.fileno"><code class="xref py py-meth docutils literal"><span class="pre">fileno()</span></code></a>方法的对象。</span><span class="yiyi-st" id="yiyi-204">kevent内部存储整数。</span></p></dd></dl><dl class="attribute"><dt id="select.kevent.filter"><span class="yiyi-st" id="yiyi-205"> <code class="descclassname">kevent.</code><code class="descname">filter</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-206">内核过滤器的名称。</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-207">不变</span></th><th class="head"><span class="yiyi-st" id="yiyi-208">含义</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-209"><code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_READ</span></code></span></td><td><span class="yiyi-st" id="yiyi-210">使用描述器,并在有可用数据可读时返回</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-211"><code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_WRITE</span></code></span></td><td><span class="yiyi-st" id="yiyi-212">使用描述器,并在有可用数据可写时返回</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-213"><code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_AIO</span></code></span></td><td><span class="yiyi-st" id="yiyi-214">AIO请求</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-215"><code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_VNODE</span></code></span></td><td><span class="yiyi-st" id="yiyi-216">发生在<em>fflag</em>中观看的一个或多个请求的事件时返回</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-217"><code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_PROC</span></code></span></td><td><span class="yiyi-st" id="yiyi-218">监视进程标识上的事件</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-219"><code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_NETDEV</span></code></span></td><td><span class="yiyi-st" id="yiyi-220">监视网络设备上的事件[Mac OS X上不可用]</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-221"><code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_SIGNAL</span></code></span></td><td><span class="yiyi-st" id="yiyi-222">当监视信号传递到进程时返回</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-223"><code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_TIMER</span></code></span></td><td><span class="yiyi-st" id="yiyi-224">建立任意定时器</span></td></tr></tbody></table></dd></dl><dl class="attribute"><dt id="select.kevent.flags"><span class="yiyi-st" id="yiyi-225"> <code class="descclassname">kevent.</code><code class="descname">flags</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-226">过滤操作。</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-227">不变</span></th><th class="head"><span class="yiyi-st" id="yiyi-228">含义</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-229"><code class="xref py py-const docutils literal"><span class="pre">KQ_EV_ADD</span></code></span></td><td><span class="yiyi-st" id="yiyi-230">添加或修改事件</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-231"><code class="xref py py-const docutils literal"><span class="pre">KQ_EV_DELETE</span></code></span></td><td><span class="yiyi-st" id="yiyi-232">从队列中删除事件</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-233"><code class="xref py py-const docutils literal"><span class="pre">KQ_EV_ENABLE</span></code></span></td><td><span class="yiyi-st" id="yiyi-234">Permitcontrol()返回事件</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-235"><code class="xref py py-const docutils literal"><span class="pre">KQ_EV_DISABLE</span></code></span></td><td><span class="yiyi-st" id="yiyi-236">禁用事件</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-237"><code class="xref py py-const docutils literal"><span class="pre">KQ_EV_ONESHOT</span></code></span></td><td><span class="yiyi-st" id="yiyi-238">在第一次发生后删除事件</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-239"><code class="xref py py-const docutils literal"><span class="pre">KQ_EV_CLEAR</span></code></span></td><td><span class="yiyi-st" id="yiyi-240">检索事件后重置状态</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-241"><code class="xref py py-const docutils literal"><span class="pre">KQ_EV_SYSFLAGS</span></code></span></td><td><span class="yiyi-st" id="yiyi-242">内部事件</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-243"><code class="xref py py-const docutils literal"><span class="pre">KQ_EV_FLAG1</span></code></span></td><td><span class="yiyi-st" id="yiyi-244">内部事件</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-245"><code class="xref py py-const docutils literal"><span class="pre">KQ_EV_EOF</span></code></span></td><td><span class="yiyi-st" id="yiyi-246">过滤特定的EOF条件</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-247"><code class="xref py py-const docutils literal"><span class="pre">KQ_EV_ERROR</span></code></span></td><td><span class="yiyi-st" id="yiyi-248">请参阅返回值</span></td></tr></tbody></table></dd></dl><dl class="attribute"><dt id="select.kevent.fflags"><span class="yiyi-st" id="yiyi-249"> <code class="descclassname">kevent.</code><code class="descname">fflags</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-250">过滤特定标志。</span></p><p><span class="yiyi-st" id="yiyi-251"><code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_READ</span></code>和<code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_WRITE</span></code>过滤器标记:</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-252">不变</span></th><th class="head"><span class="yiyi-st" id="yiyi-253">含义</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-254"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_LOWAT</span></code></span></td><td><span class="yiyi-st" id="yiyi-255">低水位标记的套接字缓冲区</span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-256"><code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_VNODE</span></code>过滤器标志:</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-257">不变</span></th><th class="head"><span class="yiyi-st" id="yiyi-258">含义</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-259"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_DELETE</span></code></span></td><td><span class="yiyi-st" id="yiyi-260"><em>unlink()</em>被调用</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-261"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_WRITE</span></code></span></td><td><span class="yiyi-st" id="yiyi-262">发生写操作</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-263"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_EXTEND</span></code></span></td><td><span class="yiyi-st" id="yiyi-264">文件已扩展</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-265"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_ATTRIB</span></code></span></td><td><span class="yiyi-st" id="yiyi-266">属性已更改</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-267"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_LINK</span></code></span></td><td><span class="yiyi-st" id="yiyi-268">链接计数已更改</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-269"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_RENAME</span></code></span></td><td><span class="yiyi-st" id="yiyi-270">该文件已重命名</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-271"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_REVOKE</span></code></span></td><td><span class="yiyi-st" id="yiyi-272">对文件的访问被撤销</span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-273"><code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_PROC</span></code>过滤器标志:</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-274">不变</span></th><th class="head"><span class="yiyi-st" id="yiyi-275">含义</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-276"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_EXIT</span></code></span></td><td><span class="yiyi-st" id="yiyi-277">该进程已退出</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-278"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_FORK</span></code></span></td><td><span class="yiyi-st" id="yiyi-279">该进程调用了<em>fork()</em></span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-280"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_EXEC</span></code></span></td><td><span class="yiyi-st" id="yiyi-281">该进程已经执行了一个新的进程</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-282"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_PCTRLMASK</span></code></span></td><td><span class="yiyi-st" id="yiyi-283">内部过滤器标志</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-284"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_PDATAMASK</span></code></span></td><td><span class="yiyi-st" id="yiyi-285">内部过滤器标志</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-286"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_TRACK</span></code></span></td><td><span class="yiyi-st" id="yiyi-287">通过<em>fork()</em>跟踪流程</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-288"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_CHILD</span></code></span></td><td><span class="yiyi-st" id="yiyi-289">在<em>NOTE_TRACK</em>的子进程上返回</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-290"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_TRACKERR</span></code></span></td><td><span class="yiyi-st" id="yiyi-291">无法附加到孩子</span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-292"><code class="xref py py-const docutils literal"><span class="pre">KQ_FILTER_NETDEV</span></code>过滤器标记(Mac OS X上不可用):</span></p><table border="1" class="docutils"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-293">不变</span></th><th class="head"><span class="yiyi-st" id="yiyi-294">含义</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-295"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_LINKUP</span></code></span></td><td><span class="yiyi-st" id="yiyi-296">链接起来</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-297"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_LINKDOWN</span></code></span></td><td><span class="yiyi-st" id="yiyi-298">链接已关闭</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-299"><code class="xref py py-const docutils literal"><span class="pre">KQ_NOTE_LINKINV</span></code></span></td><td><span class="yiyi-st" id="yiyi-300">链路状态无效</span></td></tr></tbody></table></dd></dl><dl class="attribute"><dt id="select.kevent.data"><span class="yiyi-st" id="yiyi-301"> <code class="descclassname">kevent.</code><code class="descname">data</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-302">过滤特定数据。</span></p></dd></dl><dl class="attribute"><dt id="select.kevent.udata"><span class="yiyi-st" id="yiyi-303"> <code class="descclassname">kevent.</code><code class="descname">udata</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-304">用户定义的值。</span></p></dd></dl></div></div></div> |