文件句柄的问题

ysu108 2012-10-23 09:50:35
在linux下,一个进程可以访问的文件句柄的数目是有限制的。我的问题是,为什么要对句柄的数目有限制呢?而且默认的为1024,为什么这么小呢?句柄的本质是什么呢?
...全文
162 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
virtualxmars 2012-10-24
  • 打赏
  • 举报
回复
句柄的本质是资源ID号。
而句柄存在的原因在于防止资源的直接篡改操作。例如你打开了一个文件句柄,系统实际上会开辟一段内存空间,保存了这个文件的一些信息,可以认为这些信息就是一个结构体,和我们定义的类实例没有任何区别。但是如果直接将该结构体的地址返回给用户,则用户则能对它进行任意的篡改,这是非常不安全的行为。所以,系统维护了一个句柄表。这个表实际就是映射表,每个句柄值都映射到前面所说的资源结构体的实际内存位置。每当你使用系统提供的API对资源进行操作时,它先从句柄表中查询该结构体的地址,然后再根据结构体内容进行具体的操作。

只有这样,才能保证我们仅能通过系统暴露的API对资源进行“受限”、“安全”的操作。
_暮落_ 2012-10-24
  • 打赏
  • 举报
回复
因为linux系统里都是以文件来表示的,所以在做搞并发的web系统时,修改文件句柄限制那是必须的。

查看某个进程使用了的文件句柄数
# sudo ps -ef | grep java
root 1663 1 0 02:37 ? 00:00:43 /opt/bitnami/java/bin/java
从结果中可得知进程的pid,然后根据pid查看该进程当前使用的文件句柄数
#sudo ls /proc/1663/fd | wc -l
1022
发现句柄数一直就停留在1022,同时top查看发现load持续增高。于是先查看了下当前进程的句柄数限制。
#sudo cat /proc/1663/limits | grep "files"
Max open files 1024 1024 files
发现限制卡在这了,于是修改/etc/sysctl.conf文件,添加一行如下:
fs.file-max=30720
保存。并执行
#sudo sysctl -p
然后再查看就发现已经改过来了。
Google发现linux系统里有两种文件句柄限制,一种是系统级的,一种是用户级的。
修改系统级的: www.2cto.com
#echo "30720" > /proc/sys/fs/file-max
修改用户级的:
#sudo vi /etc/security/limits.conf
增加如下行:
* soft nofile 2048
* hard nofile 32768
星号表示任何用户,soft/hard表示软限制、硬限制。修改/etc/pam.d/login文件指定使用PAM
session required /lib/security/pam_limits.so
不过需要注意的是系统是32位还是64位,若是64位的那就是/lib64/security/pam_limits.so
上面的修改后,reboot,再次查看
#ulimit -n
30720
修改成功。
yddd2011 2012-10-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

句柄的本质是资源ID号。
而句柄存在的原因在于防止资源的直接篡改操作。例如你打开了一个文件句柄,系统实际上会开辟一段内存空间,保存了这个文件的一些信息,可以认为这些信息就是一个结构体,和我们定义的类实例没有任何区别。但是如果直接将该结构体的地址返回给用户,则用户则能对它进行任意的篡改,这是非常不安全的行为。所以,系统维护了一个句柄表。这个表实际就是映射表,每个句柄值都映射到前面所说的资源结构体……
[/Quote]
++
「已注销」 2012-10-24
  • 打赏
  • 举报
回复
跟句柄表相关。
你可以比较下char 为了只有8位,为什么这么小?
一个QQ号码是一个unsigned int型,那么最多几个QQ号呢,为什么要有这个限制呢?

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧