Warm tip: This article is reproduced from serverfault.com, please click

python-如果程序读写同一缓冲区会发生什么?

(python - What happend if a program read and write to same buffer?)

发布于 2020-11-28 15:19:19

我遇到的是我写了一个名为的示例python脚本tt.py

import time

while True:
    print(123)
    time.sleep(0.5)

我通过运行它python tt.py &,它将输出到123正在进行的终端而且,如果我l在几秒钟的输入后输入了一个字符s,该命令就ls可以正常工作。

但是为什么,正如我所知的一点伪终端:主端和从端。我以为bash的stdin,stdout,stderr被重定向到从属端。因此,在我看来,bash应该返回l123\n123\n...s未找到的命令

因此,更笼统的问题是,当bash指向相同的文件描述符时,它如何知道输出的是哪个?

或者在这种情况下我误会了,在此先感谢!


更新:

我知道stdin和stdout指向不同的描述,但是它们可以指向相同的对吗?

因此,在我看来,python脚本的标准输出到psuedoterminal的从属端,而终端在主端显示流。似乎我不知道终端stdin如何进入bash的stdin。是不是先进入主端,然后进入从属端,然后是bash?

如果是这样,我会在主机端搞砸了,因为它同时接收了python脚本的输出和终端的输入。

Questioner
roachsinai
Viewed
11
Barmar 2020-11-29 00:13:27

伪终端由两个独立的数据通道组成,每个通道都有自己的缓冲区。

有一个通道可以将已写入从属pty的数据传输到主控pty。还有另一个通道将写入主站的数据传输到从站。

写入到pty的从属端的任何内容都将由与主控端相连的进程读取。在这种情况下,这是你的终端应用程序。它在终端窗口中显示此数据。

两者pythonls都正在写入从属pty,并且它们的输出将显示在窗口中。

当应用程序从从属pty读取时,它将获得其他进程写入主控端的内容。终端应用程序在键盘上输入你键入的内容,而不是发送到从属端的输出。

因此,shell不会将python脚本的输出作为输入读取。

如果两个方向不是独立的,那么每个产生输出并读取输入的程序都将变得完全混乱,因为它最终将读取自己的输出。