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