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

use*_*550 4 unix operating-system

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

rpy*_*rpy 5

假设 stdin/stdout(具有相同的逻辑名称)在所有进程之间共享是错误的.

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

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

正常的设置方式是:

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

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

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

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