为什么 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 的范围甚至更有限,例如 reboot
和 stat
,它们总是 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
.
在 Linux 中,我注意到打开的系统调用 return 是一个 int
。但是可用的文件描述符总数只有20个对吧(如果我错了请纠正我)?那么,为什么他们不将 return 的值设为 short
,这比 return 一个整数更有效。
可用文件描述符的数量远远超过二十个。可以使用 ulimit 命令控制该值。我的 linux 框中的当前默认值为 1024。如果需要,您可以将值设置得更高。
所以,open
不是 return short,因为可以有更多的文件描述符然后将适合一个 short 值。
虽然管理员可以根据需要设置下限,但没有 Linux 范围内的 20 个限制。
专用服务器可以有100k+甚至1M+并发TCP连接,每个都需要一个打开的FD。
但是,有些系统调用 return 的范围甚至更有限,例如 reboot
和 stat
,它们总是 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
.