Board logo

标题: 侦测程序句柄泄露的统计方法(1) [打印本页]

作者: look_w    时间: 2018-6-13 14:47     标题: 侦测程序句柄泄露的统计方法(1)

句柄介绍句柄的介绍及应用句柄是在 Windows 中引入的一个概念,它是和对象一一对应的 32 位无符号整数值。句柄可以映射到唯一的对象,它是处理对象的一个接口,对于所涉及的对象,可以通过相应的句柄来操作它。句柄的引入主要是操作系统为了避免应用程序直接对某个对象的数据结构进行操作为目的,用操作句柄来代替操作对象。
在 Linux 环境中,任何事物都是用文件来表示,设备是文件,目录是文件,socket 也是文件。用来表示所处理对象的接口和唯一接口就是文件。应用程序在读 / 写一个文件时,首先需要打开这个文件,打开的过程其实质就是在进程与文件之间建立起连接,句柄的作用就是唯一标识此连接。此后对文件的读 / 写时,目标文件就由这个句柄作为代表。最后关闭文件其实就是释放这个句柄的过程,使得进程与文件之间的连接断开。
句柄的产生和结构要了解 Linux 当中的句柄,必须先了解 Linux 的文件系统,下图表示了 Linux 的每个进程 (task) 的结构,及 task 所打开的文件的结构。
图 1. task_struct 的结构图以下主要列举 task_struct, files_struct的数据结构:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct task_struct {
    ……
/* filesystem information */
     struct fs_struct *fs;
    ……
/* open file information */
     struct files_struct *files;
    ……
/* limits */
     struct rlimit rlim[RLIM_NLIMITS]; /* rlim[7] 表示 open file 的限制 /
}

struct files_struct {
    ……
struct file ** fd; /* current fd array */
……
struct files * fd_array[NR_OPEN_DEFAULT];
}




files_struct数据结构中最主要的就是 file 结构指针数组 fd_array[],这个数组的大小是固定的,即 32,其下标即为“打开文件号”。fd 最初指向 fd_array[]。一个进程可以打开多少个文件取决于该进程的 task_struct 结构中关于可用资源的限制 rlim[7],在这个限制以内,如果超过了 file 结构指针数组的容量就可以通过 expand_fd_array() 来扩充该数组的容量,并让 fd 指向新的数组。
当前进程的进程控制块 (task_struct) 结构中有一个 file 指针,指向已打开的文件信息结构 files_struct。当进程通过打开文件 ( 如 open()) 与具体的文件建立起连接,实际上系统会查找一个空闲的 fid 作为 fd_array 的下标,将其指向一个 file 数据结构,返回给进程的就是 fid,这个 fid 就是句柄。
系统对句柄的管理了解了句柄的产生,接下来我们来介绍 Linux 是如何对句柄进行管理。
用户通过 open() 来申请资源,在系统内核中实际会调用 sys_open() 方法来实现真正的资源申请工作。sys_open() 的代码在 fs/open.c 中:long sys_open(const char * filename, int flags, int mode) 。调用参数 filename 实际上是文件的路径名(绝对路径或者相对路径名);mode 表示打开的模式,如只读等等;flag 则包含了许多标志位,可以表示打开模式以外的一些属性和要求。
sys_open 具体的操作过程如下:
图 2. sys_open 操作过程图用户向系统申请文件资源是否能够成功,主要取决于 get_unused_fd 函数。如果函数的返回值为大于 0 的正整数,则 sys_open 能够获得系统文件资源;如果函数的返回值为-1,说明申请失败,该进程所申请的文件数已经超过系统设置的最大值。get_unused_fd 具体的操作过程如下:
图 3. get_unused_fd 操作过程图与打开文件的方式类似,Linux 系统调用 close() 函数关闭文件,并由内核中的 sys_close() 负责具体实现。sys_close() 函数也处于 fs/open.c 中:long sys_close(unsigned int fd) 。它的作用是释放进程已经占用的某一文件资源。调用参数 fd 为需要关闭的文件句柄值。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0