为什么 open(linux) 的 return 值必须是 int 而不是 short?

Why does the return value of open(linux) have to be an int instead of say short?

在 Linux 中,我注意到打开的系统调用 return 是一个 int。但是可用的文件描述符总数只有20个对吧(如果我错了请纠正我)?那么,为什么他们不将 return 的值设为 short,这比 return 一个整数更有效。

可用文件描述符的数量远远超过二十个。可以使用 ulimit 命令控制该值。我的 linux 框中的当前默认值为 1024。如果需要,您可以将值设置得更高。

所以,open 不是 return short,因为可以有更多的文件描述符然后将适合一个 short 值。

虽然管理员可以根据需要设置下限,但没有 Linux 范围内的 20 个限制。

专用服务器可以有100k+甚至1M+并发TCP连接,每个都需要一个打开的FD。

但是,有些系统调用 return 的范围甚至更有限,例如 rebootstat,它们总是 return 0-1。为什么那些 return int 而不是 16 位短裤甚至 8 位字符?

这有几个原因(此处概述了 32 位 x86 Linux):

  • 为了更容易编写系统库和编译器,x86 32 位 Linux 有一个约定,即所有系统调用 return 32 位寄存器 eax 中的值。无一例外。

    glibc 的 open() 是实际系统调用之上的薄包装。 glibc 试图对该系统调用或任何其他系统调用施加额外限制是没有意义的。

    在最好的情况下,您可以在几纳秒内保存 2 个字节。在最坏的情况下,您会将自己逼入一个角落,需要付出巨大的迁移努力才能摆脱。

  • A CPU 以其原始字长工作最为舒适。当您在 32 位 x86 上有单个(非数组)16 位或 8 位值时,它们通常不会更快。

    因此,当编译器认为这将使程序整体更快时,它可能会将它们转换为 32 位值,这通常是这种情况(通过将值放入 32 位寄存器或将地址对齐到32 位边界)。

  • 程序员更容易。由于大多数系统调用 return < 0 来指示错误,因此最好坚持这一点,而不是通过 returning 一个 unsigned short.