在小组讨论中,我对这个问题很感兴趣 -
为什么UNIX标准要求保证仅为进程分配最低可用文件描述符?
只有我能想到的可能答案是可扩展性。由于我们总是选择最少的可用描述符,因此描述符位图的使用部分主要是密集的,因此数组的增长较慢。
我只是想知道是否还有其他原因我不知道。
另外,如果我们知道给定的描述符比另一个描述符更大/更小,我们是否有一些场景可以得出逻辑结论(我们可以在程序中使用的那些结论)。我的理解不允许使用这种技术,因为它不保证描述符的年龄。
答案 0 :(得分:4)
有各种各样的原因,但最终的原因是“因为这是它一直以来的方式”。
dup2()
电话可用之前,这很重要。传统上,进程的文件描述符表是固定大小的,非常小(第7版Unix,IIRC中有20个)。
确定性机制对于shell中的I / O重定向至关重要。例如:
cat file1 file2 > file3
shell需要将标准输出重定向到file3
。因此,它可以使用:
close(1); // Standard output
if (open("file3", O_WRONLY|O_CREAT, 0666) != 1)
…error creating file…
并且它会知道因为标准输入已经打开(文件描述符0),open()
将返回文件描述符1.
现在,您无法从文件描述符值中推断出任何内容。我可以写:
int fd1 = open(filename, flags, mode);
int fd2 = dup2(fd1, 1024);
close(fd1);
并且fd2
(应该)包含1024的事实并没有告诉您与文件描述符3相比打开它的顺序(可能下一个open()
可能会返回)呼叫)。
答案 1 :(得分:2)
如果你关闭标准输入(fd 0)然后打开一个新文件,它将获得fd 0.(同样对于fds 1和2,stdout
和stderr
,如果较低的fds有尚未关闭。)这种可预测性非常有用,并且在dup2
标准化之前用于许多unix程序,以便在子进程中重定向标准输入/输出/错误。
答案 2 :(得分:1)
简单:在1970年,64 KB (65536 字节)很多。这就是发明Unix的系统(确切地说PDP-7,默认情况下有9 KB ,并且可以选择将其升级到144 KB ...例如, $ 20'000)。
在这种环境中,每一个位都是有价值的(这解释了一些奇怪的东西,如今使用整数来保存指针,反之亦然)。
因此算法会尝试在一个非常小的表(当时大小固定)中分配第一个空闲文件描述符。这也会使算法终止得更快,这也很好,因为大多数计算机每秒只能执行几十万到几千个命令。