文件描述符

最近在做TCP/IP传输相关项目,对于socket文件描述符的取值范围和分配进行了探索。

在系统头文件posix_types.h中定义了文件描述符的最大数量1024,意味着文件描述符的取值范围是0~1023,并且0、1、2已经被分配了,0表示标准输入,1表示标准输出,2表示标准错误输出,而通过socket()分配的socket文件描述符的取值范围是从3~1023的。普通文件描述符和socket文件描述符是统一分配的,所以不会冲突,总数有限。如果socket()循环执行1020次,会从3分配到1023,如果继续调用socket(),就会返回-1,因为超过了文件描述符上限。如果此时调用close()关闭文件描述符,那么再调用socket(),就可以继续成功分配了,并且是从小到大从第一个没有被分配的文件描述符开始分配。

下面是示例代码:

结果:

说明socket()从3~1023分配,若返回-1,表示此时已经没有空闲的文件描述符了。

现在尝试,close几个fd然后再分配,看结果。

结果:

可以发现,关闭了3,100,102,1023,再次分配fd的时候,按照从小到大顺次分配未被分配的描述符。

具体的算法不知道,但是很巧妙,这样可以保证文件描述符的数量不会超过系统限制,循环使用文件描述符。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值