stdin和stdout如何在流程中独树一帜?

时间:2016-03-23 08:36:27

标签: unix operating-system

Stdin和stdout是由多个进程共享的单个文件,用于从用户获取输入。那么操作系统如何确保只有特定程序的输入才能在stdin中显示而不是程序?

1 个答案:

答案 0 :(得分:5)

您的假设 stdin / stdout(虽然具有相同的逻辑名称)在所有进程之间共享错误充其量。

stdin / stdout是由已启动给定进程的进程转发(或初始化)的打开文件的逻辑名称。实际上,使用标准的 fork-and-exec 模式,在 exec 之前,可能会在新进程( fork 之后)中进行设置。被召唤。

stdin / stdout通常只是从父级继承而来。所以,是的,对于给定的 filenode ,存在共享stdin和/或stdout的进程组。
此外,由于文件描述符可能是管道的一部分,因此您无需将文件系统(或设备节点)中的文件链接到任何众所周知的标准通道(您还应在考虑中包含stderr

正常的设置方式是:

  • 父级(例如您的shell)正在调用fork
  • 分叉进程(子进程)正在设置环境,标准I / O通道和其他任何内容。
  • 然后,孩子执行exec以使用要执行的目标图像覆盖该过程。

设置时:它将保留现有频道或用新频道替换它们,例如创建pipe并适当地链接端点。 (老实说,创建​​管道需要在简化描述中的fork之前发生)

这样,大多数进程都有自己的I / O通道。

然而,多个进程可能会写入它们所连接的通道(具有有效的文件描述符)。当读取每个垃圾数据(通常是带有文件的终端或带有文件的行)时,只能由一个读取器读取。因此,如果你有几个(正在运行的)进程从终端读取stdin,只有一个会读取你的输入,而其他人根本不会看到这个输入。