为什么在UNIX中只分配最低可用文件描述符?

时间:2014-07-03 15:08:42

标签: c linux unix

在小组讨论中,我对这个问题很感兴趣 -

为什么UNIX标准要求保证仅为进程分配最低可用文件描述符?

只有我能想到的可能答案是可扩展性。由于我们总是选择最少的可用描述符,因此描述符位图的使用部分主要是密集的,因此数组的增长较慢。

我只是想知道是否还有其他原因我不知道。

另外,如果我们知道给定的描述符比另一个描述符更大/更小,我们是否有一些场景可以得出逻辑结论(我们可以在程序中使用的那些结论)。我的理解不允许使用这种技术,因为它不保证描述符的年龄

3 个答案:

答案 0 :(得分:4)

有各种各样的原因,但最终的原因是“因为这是它一直以来的方式”。

  1. 通过文件描述符列表可以轻松跟踪,找到第一个未使用的文件描述符。
  2. 这是确定的。在dup2()电话可用之前,这很重要。
  3. 传统上,进程的文件描述符表是固定大小的,非常小(第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,stdoutstderr,如果较低的fds有尚未关闭。)这种可预测性非常有用,并且在dup2标准化之前用于许多unix程序,以便在子进程中重定向标准输入/输出/错误。

答案 2 :(得分:1)

简单:在1970年,64 KB (65536 字节很多。这就是发明Unix的系统(确切地说PDP-7,默认情况下有9 KB ,并且可以选择将其升级到144 KB ...例如, $ 20'000)。

在这种环境中,每一个位都是有价值的(这解释了一些奇怪的东西,如今使用整数来保存指针,反之亦然)。

因此算法会尝试在一个非常小的表(当时大小固定)中分配第一个空闲文件描述符。这也会使算法终止得更快,这也很好,因为大多数计算机每秒只能执行几十万到几千个命令。