我遇到的是我写了一个名为的示例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脚本的输出和终端的输入。
伪终端由两个独立的数据通道组成,每个通道都有自己的缓冲区。
有一个通道可以将已写入从属pty的数据传输到主控pty。还有另一个通道将写入主站的数据传输到从站。
写入到pty的从属端的任何内容都将由与主控端相连的进程读取。在这种情况下,这是你的终端应用程序。它在终端窗口中显示此数据。
两者python
和ls
都正在写入从属pty,并且它们的输出将显示在窗口中。
当应用程序从从属pty读取时,它将获得其他进程写入主控端的内容。终端应用程序在键盘上输入你键入的内容,而不是发送到从属端的输出。
因此,shell不会将python脚本的输出作为输入读取。
如果两个方向不是独立的,那么每个产生输出并读取输入的程序都将变得完全混乱,因为它最终将读取自己的输出。
正如您所张贴的:“当应用程序从从属pty读取时,它将获得其他进程向主端写入的内容。”尽管从bash从bash读取bash时,如何确保除命令以外主控为空
ls
?我不明白你的问题。它不需要确保任何事情。它只会读取您键入的所有内容。首先,键入
python tt.py&
,它会读取并执行命令。然后输入typrels
,然后读取并执行它。每次键入内容时,它都会读取并执行。像二进制
bash
,ls
或者其他人,他们把标准输入,标准输出,标准错误,它是独立的。我所知道的是pty master只是一个文件描述符,因此它无法同时管理stdin和stdout(我以为我在这里错了,但不知道在哪里)。但是我发布的示例是pty master同时具有stdin和stdout。也许我明白了,如果是终端窗口,则是slave的stdout?作为第一段。
pty中有单独的缓冲区,用于slave-> master和master-> slave通信。