为什么bash/zsh都以读写模式打开fd0/1/2?

为什么bash/zsh都以读写模式打开fd0/1/2?

根据我的理解,fd0 用于标准输入,因此进程只会从中读取而不写入。类似地,fd1 和 fd2 用于 stdout/stderr,因此进程只会写入它。但 bash/zsh 似乎只在读写 (u) 模式下打开一个 tty 设备文件一次,并在 3 个描述符之间复制它。与此相关的问题:

  1. 理解对吗?
  2. 复制只是为了在系统文件表中保存多个条目(每个条目处于不同的模式:r/w)?行为上会有差异吗?
  3. 可以安全地假设 bash/zsh 会以独立于操作系统的读写 (u) 模式打开 fd0/1/2 吗?

答案1

是的,这是与 . 重复的相同文件描述符dup2()

主要效果实际上是它们都引用相同的“打开文件”结构,因此它们共享状态,例如串行控制台上的波特率设置或文件的读/写位置。

除了“它们最有可能存在”之外,您的程序不能假设有关 stdin/stdout/stderr 的任何内容。当 stdout 重定向到文件或管道时,它很可能是只写的,并且引用与其他文件不同的文件。程序通常可以假设这些文件描述符是打开的,并且用户知道如果强制关闭它们会发生奇怪的事情。

如果您确实需要一个终端句柄来与用户交谈,请/dev/tty从您的程序中打开,这将为您提供一个句柄控制终端,如果存在的话。如果您的程序作为后台服务运行,这可能会失败。

相关内容