守护进程在检测到特定目录中是否存在文本文件后,启动一个可执行文件,该文件打开上述文本文件以读取数据,然后通过 TCP 套接字传输其数据。
打开的文本文件的文件描述符的编号与有关文件处理的其他信息一起被记录。
人们注意到,有时 open() 调用返回的文件描述符为零(通常这是为 stdin 保留的)。没有检测到错误,一切正常。 C 中的源代码除了 open() 和后来的 close() 之外什么也没做 - 没有对返回的文件句柄执行重定向、复制或任何其他魔法。
在什么情况下进程的文件描述符 0 可以供一般使用(并且不归因于 stdin)?
平台是AIX 5.2。
答案1
在什么情况下进程的文件描述符 0 可以供一般使用(并且不归因于 stdin)
当有人关闭标准输入时,例如<&-
从 shell 关闭标准输入。
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
int main() {
printf("%d\n",open("foo",O_CREAT));
}
答案2
系统open
调用通常返回尚未使用的最低文件描述符。对于典型的程序,打开的文件从 3 开始,因为文件描述符 0、1 和 2 用于预打开的标准描述符(输入、输出和错误)。守护进程永远不会读取任何输入或产生任何输出,因此它们通常会关闭文件描述符 0 和 1,或重新打开/dev/null
那里。如果守护进程关闭文件描述符 0,那么它打开的下一个文件将位于该描述符上。这没有什么问题。
文件描述符 0 并不是真正“归因于 stdin”——相反,它是stdin 根据 stdin 的定义。正常运行环境会安排打开文件描述符 0 以供输入,但不读取任何输入的程序可以随意使用该描述符来实现其想要的任何目的。