默认文件描述符的 open() 控制台

默认文件描述符的 open() 控制台

我正在阅读 C 语言的 shell 程序实现(来自 MIT 6.828 操作系统工程课程的 xv6 shell)。

该 shell 的函数main()以以下代码开始:

//Assumes three file descriptors open
while((fd = open("console", O_RDWR)) >= 0){
    if(fd >= 3){
        close(fd)
        break;
    }
}

这是 xv6 书中的一段引用,它解释了上面的代码:

“shell 确保它始终打开三个文件描述符,这是控制台的默认文件描述符。”


我知道这open()将返回一个可用数量最少的文件描述符,因此这段代码确保打开的文件描述符不超过三个,在阅读作者的解释后,这一点非常明显。

但是,我不明白的部分是:

  1. 为什么 shell 要关闭除 0、1 和 2 之外的所有文件描述符?毕竟可以保证 0、1 和 2 将与控制台关联,不是吗?为什么 shell 应该关心关闭数量较多的文件描述符?

  2. 我想我不太明白这里的控制台( /dev/console ?) 文件的用途。

答案1

此代码片段将打开/dev/console。生成的文件描述符是尚未打开的编号最小的文件描述符。如果该数字最多为 2,则再次执行循环。如果该数字为 3 或以上,则描述符关闭并且循环停止。

当循环结束时,文件描述符 0 到 2 (标准输入、标准输出和标准错误)保证是开放的。它们要么以前打开过,并且可能连接到任何文件,要么刚刚打开过,并且连接到/dev/console.

的选择/dev/console很奇怪。我希望/dev/tty它始终是与调用进程的进程组关联的控制终端。这是少数几个文件之一POSIX 标准要求存在/dev/console是个系统控制台,这是发送到控制台的系统日志消息的位置; shell 关心这个是没有用的。

答案2

循环很有趣。 'open()' 返回最小数量的文件描述符。例如,当前的fd是10,说明0,1...和9之前是打开的。它正在关闭刚刚打开的控制台的一个额外文件描述符。

相关内容