我正在阅读 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()
将返回一个可用数量最少的文件描述符,因此这段代码确保打开的文件描述符不超过三个,在阅读作者的解释后,这一点非常明显。
但是,我不明白的部分是:
为什么 shell 要关闭除 0、1 和 2 之外的所有文件描述符?毕竟可以保证 0、1 和 2 将与控制台关联,不是吗?为什么 shell 应该关心关闭数量较多的文件描述符?
我想我不太明白这里的控制台( /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之前是打开的。它正在关闭刚刚打开的控制台的一个额外文件描述符。