Stdin和stdout是由多个进程共享的单个文件,用于从用户获取输入。那么操作系统如何确保只有特定程序的输入才能在stdin中显示而不是程序?
答案 0 :(得分:5)
您的假设 stdin / stdout(虽然具有相同的逻辑名称)在所有进程之间共享错误充其量。
stdin
/ stdout
是由已启动给定进程的进程转发(或初始化)的打开文件的逻辑名称。实际上,使用标准的 fork-and-exec 模式,在 exec 之前,可能会在新进程( fork 之后)中进行设置。被召唤。
stdin
/ stdout
通常只是从父级继承而来。所以,是的,对于给定的 filenode ,存在共享stdin
和/或stdout
的进程组。
此外,由于文件描述符可能是管道的一部分,因此您无需将文件系统(或设备节点)中的文件链接到任何众所周知的标准通道(您还应在考虑中包含stderr
)
正常的设置方式是:
fork
exec
以使用要执行的目标图像覆盖该过程。设置时:它将保留现有频道或用新频道替换它们,例如创建pipe
并适当地链接端点。 (老实说,创建管道需要在简化描述中的fork之前发生)
这样,大多数进程都有自己的I / O通道。
然而,多个进程可能会写入它们所连接的通道(具有有效的文件描述符)。当读取每个垃圾数据(通常是带有文件的终端或带有文件的行)时,只能由一个读取器读取。因此,如果你有几个(正在运行的)进程从终端读取stdin,只有一个会读取你的输入,而其他人根本不会看到这个输入。