擅长:python、mysql、java
<p>管道位于进程的外部(它是一个操作系统的东西),由进程使用读写句柄进行访问。许多进程可能有管道句柄,如果管理不当,可能以各种灾难性的方式进行读写。当管道的所有手柄关闭时,管道关闭。你知道吗</p>
<p>虽然进程执行在Linux和Windows中的工作方式不同,但基本上是这样的(我要为此付出代价!)你知道吗</p>
<pre><code>p1 = Popen(["dmesg"], stdout=PIPE)
</code></pre>
<p>创建管道1,给dmesg一个写句柄作为其stdout,并在父级中返回一个读句柄作为p1.stdout。现在您有了一个带有2个句柄的管道(pipe\u 1 write in dmesg,pipe\u 1 read in parent)。你知道吗</p>
<pre><code>p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
</code></pre>
<p>创建管道2。给grep一个管道2的写句柄和管道1的读句柄的副本。现在您有了2个管道和5个句柄(在dmesg中写入管道1、在grep中读取管道1和写入管道2、在父级中读取管道1和读取管道2)。你知道吗</p>
<pre><code>p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.
</code></pre>
<p>请注意,管道1有两个读取句柄。您希望grep具有读取句柄,以便它读取dmesg数据。您不再需要父级中的句柄。关闭它,使管道1上只有一个读取句柄。如果grep死了,它的pipe_1读取句柄将关闭,操作系统会注意到pipe_1没有剩余的读取句柄,并向dmesg发出坏消息。你知道吗</p>
<pre><code>output = p2.communicate()[0]
</code></pre>
<p>dmesg将数据发送到stdout(pipe1写入句柄),stdout开始填充pipe1。grep读取stdin(管道读取句柄),它清空管道。grep还编写stdout(pipe2写入句柄)来填充pipe2。父进程读取管道2。。。你给自己弄了条管道!你知道吗</p>