Linux 句柄是什么 ?

本文探讨了操作系统中句柄和文件描述符(fd)的概念及其作用。解释了句柄不仅限于指针,而是操作系统用来标识和操作内存或对象的一种方式。在Linux中,文件描述符用于文件操作,其本质是内核中打开文件表的索引。

1.句柄就是一个标识符,只要获得对象的句柄,我们就可以对对象进行任意的操作。

2.句柄不一定是指针。操作系统用句柄可以找到一块内存,这个句柄可能是标识符,例如mapkey,也可能是指针,看操作系统怎么处理的了。

fd算是在某种程度上替代句柄吧;

Linux 有相应机制,但没有统一的句柄类型,各种类型的系统资源由各自的类型来标识,由各自的接口操作。

3.http://tech.ddvip.com/2009-06/1244006580122204_11.html

在操作系统层面上,文件操作也有类似于FILE的一个概念,在Linux里,这叫做文件描述符(File Descriptor),而在Windows里,叫做句柄(Handle)(以下在没有歧义的时候统称为句柄)。用户通过某个函数打开文件以获得句柄,此后用户操纵文件皆通过该句柄进行。

 

设计这么一个句柄的原因在于句柄可以防止用户随意读写操作系统内核的文件对象。无论是Linux还是Windows,文件句柄总是和内核的文件对象相关联的,但如何关联细节用户并不可见。内核可以通过句柄来计算出内核里文件对象的地址,但此能力并不对用户开放。

 

下面举一个实际的例子,在Linux中,值为012fd分别代表标准输入、标准输出和标准错误输出。在程序中打开文件得到的fd3开始增长。 fd具体是什么呢?在内核中,每一个进程都有一个私有的打开文件表,这个表是一个指针数组,每一个元素都指向一个内核的打开文件对象。而fd,就是这 个表的下标。当用户打开一个文件时,内核会在内部生成一个打开文件对象,并在这个表里找到一个空项,让这一项指向生成的打开文件对象,并返回这一项的下标 作为fd。由于这个表处于内核,并且用户无法访问到,因此用户即使拥有fd,也无法得到打开文件对象的地址,只能够通过系统提供的函数来操作。

 

C语言里,操纵文件的渠道则是FILE结构,不难想象,C语言中的FILE结构必定和fd有一对一的关系,每个FILE结构都会记录自己唯一对应的fd


句柄 
http://zh.wikipedia.org/wiki/%E5%8F%A5%E6%9F%84

程序设计 ,句柄是一种特殊的智能指针 。当一个应用程序 要引用其他系统(数据库操作系统 )所管理的内存 块或对象 时,就要使用句柄。

句柄与普通指针 的区别在于,指针包含的是引用对象 内存地址 ,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址 上。这种间接访问对象 的模式增强了系统对引用对象 的控制。(参见封装 )

在上世纪80年代的操作系统(如Mac OS Windows )的内存管理 中,句柄被广泛应用。Unix 系统的文件描述符 基本上也属于句柄。和其它桌面环境 一样,Windows API 大量使用句柄来标识系统中的对象 ,并建立操作系统与用户空间 之间的通信渠道。例如,桌面上的一个窗体由一个HWND 类型的句柄来标识。

如今,内存 容量的增大和虚拟内存 算法使得更简单的指针 愈加受到青睐,而指向另一指针的那类句柄受到冷淡。尽管如此,许多操作系统 仍然把指向私有对象 的指针以及进程传递给客户端 的内部数组 下标称为句柄。

<think> 我们正在讨论如何查看Linux系统中的句柄信息。根据用户提供的引用,我们可以总结出以下方法: 1. **查看单个进程的句柄使用情况**: - 使用`lsof`命令:`lsof -p <PID>` 可以查看指定进程打开的所有文件(包括套接字、普通文件等) - 查看`/proc`文件系统:`ls -l /proc/<PID>/fd/` 可以列出该进程打开的所有文件描述符(句柄) 2. **查看系统总句柄数**: - 查看`/proc/sys/fs/file-nr`:`cat /proc/sys/fs/file-nr` 会显示三个数字,分别表示已分配文件句柄数、已使用但未回收文件句柄数、以及系统最大文件句柄数。 - 使用`sysctl`命令:`sysctl fs.file-nr` 同样可以查看系统文件句柄信息。 3. **查看系统最大句柄数限制**: - `cat /proc/sys/fs/file-max` 显示系统级别的最大文件句柄数。 4. **查看用户进程的句柄限制**: - 使用`ulimit`命令:`ulimit -n` 显示当前shell会话的单个进程可打开的最大文件句柄数(软限制),`ulimit -Hn` 显示硬限制。 5. **永久修改句柄数限制**: - 修改`/etc/security/limits.conf`文件,例如: ``` * soft nofile 65536 * hard nofile 65536 ``` - 修改系统级别限制:在`/etc/sysctl.conf`中添加`fs.file-max=1000000`,然后执行`sysctl -p`生效。 现在,针对用户的问题“我想查找在Linux系统中查看句柄的命令”,我们给出具体的命令操作步骤: ### 查看句柄的命令 #### 1. 查看单个进程打开的句柄 ```bash # 方法1:使用lsof(需安装) lsof -p <进程PID> # 方法2:查看/proc文件系统 ls -l /proc/<进程PID>/fd/ # 统计进程打开句柄数量 ls -l /proc/<进程PID>/fd/ | wc -l ``` #### 2. 查看系统总句柄使用情况 ```bash # 查看系统当前已分配、已使用和最大句柄数 cat /proc/sys/fs/file-nr # 输出示例:三个数字(以制表符或空格分隔) # 已分配文件句柄数 已使用但未回收文件句柄数 系统最大文件句柄数 # 例如: 7932 0 9223372036854775807 # 查看系统级别的最大句柄数限制 cat /proc/sys/fs/file-max ``` #### 3. 查看当前用户的句柄限制 ```bash # 显示当前shell的单个进程最大文件句柄数(软限制) ulimit -n # 显示硬限制 ulimit -Hn ``` #### 4. 监控系统句柄使用情况(实时) 如需实时监控,可以使用`watch`命令动态查看: ```bash # 每秒刷新一次系统句柄使用情况 watch -n 1 "cat /proc/sys/fs/file-nr" ``` > **注意**:句柄(handle)在Linux中通常指文件描述符(File Descriptor),包括普通文件、目录、套接字、管道等资源。 根据引用内容[^1][^2][^3],调整系统句柄数限制的方法已在引用中说明,此处不再赘述。 §§相关问题§§ 1. 如何修改Linux系统的最大文件句柄数限制? 2. 如何查看哪些进程占用了大量文件句柄? 3. 文件句柄和端口号之间有什么关系? </think> ### Linux系统查看句柄的命令详解 在Linux系统中,文件句柄(File Handle)是操作系统管理打开文件资源的标识符。以下是查看句柄的常用命令: #### 1. 查看单个进程打开的句柄 ```bash # 查看指定PID的进程打开的所有句柄 lsof -p <PID> # 统计某个进程打开的句柄数量 ls /proc/<PID>/fd | wc -l ``` 示例输出: ``` COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 12345 root 0u CHR 1,3 0t0 1039 /dev/null nginx 12345 root 1u CHR 1,3 0t0 1039 /dev/null nginx 12345 root 2u CHR 1,3 0t0 1039 /dev/null nginx 12345 root 3u IPv4 123456 0t0 TCP *:80 (LISTEN) ``` #### 2. 查看系统总句柄使用情况 ```bash # 查看系统当前分配的句柄总数 cat /proc/sys/fs/file-nr ``` 输出示例: ``` 7932 0 9223372036854775807 ``` 三个数字分别表示: - 已分配文件句柄数 - 已使用但未回收文件句柄数 - 系统最大文件句柄数限制 #### 3. 查看系统最大句柄数限制 ```bash # 查看系统级别的最大句柄数限制 cat /proc/sys/fs/file-max # 查看当前用户的进程级句柄限制 ulimit -n ``` #### 4. 查找占用句柄最多的进程 ```bash # 按句柄数量排序显示所有进程 lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | head ``` 示例输出: ``` 1254 1532 # PID 1532 占用1254个句柄 892 2871 543 4820 ``` #### 5. 查看进程打开的句柄详情 ```bash # 查看指定进程打开的句柄详情 ls -l /proc/<PID>/fd/ ``` 输出示例: ``` lrwx------ 1 root root 64 Aug 10 10:00 0 -> /dev/null lrwx------ 1 root root 64 Aug 10 10:00 1 -> /dev/null lrwx------ 1 root root 64 Aug 10 10:00 2 -> /dev/null lrwx------ 1 root root 64 Aug 10 10:00 3 -> socket:[123456] ``` > **关键说明**: > - 句柄包括文件、套接字、管道等各种资源 > - 系统级限制通过`/proc/sys/fs/file-max`设置[^2] > - 用户级限制通过`ulimit -n`查看和设置[^3] > - 永久修改需编辑`/etc/security/limits.conf`文件[^1] 如果需要调整句柄限制,请参考: ```bash # 临时修改进程级限制 ulimit -n 65535 # 永久修改系统级限制 echo "fs.file-max=1000000" >> /etc/sysctl.conf sysctl -p ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值