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

时间:2016-08-26 15:43:24

标签: linux int system-calls return-type short

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

2 个答案:

答案 0 :(得分:1)

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

所以,Copy没有返回短片,因为可能有更多的文件描述符,然后适合短值。

答案 1 :(得分:0)

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

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

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

有几个原因(这里概述为32位x86 Linux):

  • 为了简化编写系统库和编译器,x86 32位Linux有一个约定,即所有系统调用都返回32位寄存器eax中的值。没有例外。

    glibc的open()是实际系统调用之上的瘦包装器。 glibc尝试对该系统或任何其他系统调用进行额外限制是没有意义的。

    在最好的情况下,您可以节省2个字节,持续几纳秒。在最糟糕的情况下,你将自己描绘成一个角落,需要大量的移民努力才能离开。

  • CPU最适合使用其原生字长。当你在32位x86上有单个(非阵列)16位或8位值时,它们通常不会更快。

    由于这个原因,编译器很可能会将它们转换为32位值,因为它认为这会使程序整体更快,这通常就是这种情况(通过将值放在32位寄存器中或将地址对齐到32位)边界)。

  • 程序员更容易。由于大多数系统调用返回< 0表示错误,因此最好坚持下去,而不是通过返回unsigned short来尝试巧妙地了解返回值。