文件描述符、终端和打开文件描述

问题描述 投票:0回答:0

考虑这个简单的程序:

#include <unistd.h>

int main () {
  write(STDIN_FILENO, "hello\n", 6);
  return 0;
}

并且即使我将

STDIN_FILENO
替换为
STDERR_FILENO
xor
STDOUT_FILENO
,也会在终端上查看输出。

我知道

bash
持有 fd
255
, (
zsh
,
10
), 用于在一个文件描述符关闭时保持对终端的访问的特殊目的。这似乎意味着相关流的底层表示没有真正的区别。

我的问题如下:

  • 什么区分“流设备”STDIN、STDOUT、STDERR?
  • 它们是否共享相同的打开文件描述,以便对一个的写入推进另一个的
    lseek()
    偏移量?程序如何,例如:
$ cat
hello
hello

在没有他们互相覆盖的情况下工作?

在我的Linux VM上(使用

zsh
),可以看到:

$ ls -l /proc/$$/fd
total 0
lrwx------ ... ... ... 0 -> /dev/tty1
lrwx------ ... ... ... 1 -> /dev/tty1
lrwx------ ... ... ... 10 -> /dev/tty1
lrwx------ ... ... ... 2 -> /dev/tty1

看来他们确实共享同一台设备,我希望对此有更多了解。

c shell terminal stream zsh
© www.soinside.com 2019 - 2024. All rights reserved.