在我的 Linux 环境中,文件描述符位于 /dev/fd 上。
AIX(unix) 中 stdin、stdout、stderr 文件描述符的位置在哪里。
我找不到他们。
答案1
这个问题是基于对 proc 文件系统通用性的误解。实现此功能的系统(例如 Solaris 和 Linux)具有可用于编写脚本的特殊设备,包括/dev/fd
后跟文件描述符(数字)。
对于 Solaris(以及某些 BSD,例如 MacOS、FreeBSD),/dev/fd
是 下的虚拟文件夹/dev
,而 Linux 使用符号链接进入与/proc
您的进程 ID 匹配的(虚拟)文件夹。 proc 文件系统没有标准,详细信息将要不同。
BSD 不使用相同的方案:Solaris、MacOS 和 FreeBSD 使用stdin
、stdout
、stderr
到此/dev/fd
文件夹的符号链接,而 NetBSD 和 OpenBSD 使用设备节点(具有相同的主/次编号)来执行此操作。但它们很相似。/dev/fd
与/proc
(Solaris 支持,与 BSD 不同)是分开的。
检查 AIX 5.3 和 7.1 系统,它们确实实现了 proc 文件系统,但没有/dev/fd
.然而,他们做有一个虚拟文件系统/proc
,在该文件系统下您可以找到当前的进程ID,并在那是一个fd
带有文件描述符的文件夹。
按照惯例,文件描述符被初始化为 0, 1, 2标准输入,标准输出,标准错误分别。
进一步阅读:
/proc
- 包含系统中进程和线程的状态信息(AIX 7)
对于fd
:
包含进程所有打开的文件描述符的文件。每个条目都是一个十进制数,对应于进程中打开的文件描述符。如果实体引用常规文件,则可以使用常规文件语义打开它。为了确保控制进程无法获得更大的访问权限,受控进程中除了自身的读/写打开模式之外,不存在任何文件访问模式。目录将显示为链接。尝试打开任何其他类型的条目都将失败(因此列出时将显示 0 权限)。
使用
/proc
文件系统和命令(甲骨文/Solaris)fd - 文件描述符文件(甲骨文/Solaris)
3.15 /dev/fd, 从 UNIX® 环境中的高级编程:UNIX 文件 I/O 说SVR4支持
/dev/fd
,但是快速检查一下,只有 Solaris(相对于其他两个 SVr4:AIX 和 HPUX)提供该功能。 HPUX 也缺少,因此该平台在任一位置都/proc
没有魔法设备。stdin
/dev/fd 功能由 Tom Duff 开发,出现在 Research Unix System 第 8 版中。 SVR4 和 4.3+BSD 支持。它不是 POSIX.1 的一部分。
答案2
这些是人工文件描述符,当然不需要进行处理,这解释了它们历史上不存在并且在某些系统上仍然不存在。
shell 根据您的 TTY 处理这些标准文件描述符。当 shell 启动时,它会调用isatty()
,如果它是(TTY),它会自动打开其上的标准文件描述符。