Linux内核中的文件描述符:fd的分配--get_unused_fd
作者:网络转载 发布时间:[ 2013/1/16 10:32:29 ] 推荐标签:
在Linux内核中主要有两个函数涉及到文件描述符的分配:get_unused_fd和locate_fd。本文主要讲解get_unused_fd,将会在下一篇文章中介绍locate_fd。首先给出get_unused_fd的定义(fs/open.c):
int get_unused_fd(void)
{
struct files_struct * files = current->files;//获得当前进程的打开文件列表files
int fd, error;
struct fdtable *fdt;
error = -EMFILE;
spin_lock(&files->file_lock);
repeat:
fdt = files_fdtable(files);//获得文件描述符位图结构
fd = find_next_zero_bit(fdt->open_fds->fds_bits,
fdt->max_fdset,
fdt->next_fd);
//find_next_zero_bit函数在文件描述符位图fds_bits中从next_fd位开始搜索下一个(包括next_fd)为0的位,也是分配一个文教描述符
/*
* N.B. For clone tasks sharing a files structure, this test
* will limit the total number of files that can be opened.
*/
if (fd >= current->signal->rlim[RLIMIT_NOFILE].rlim_cur)//检查是否超过当前进程限定的大可打开文件数
goto out;
/* Do we need to expand the fd array or fd set? */
error = expand_files(files, fd);//根据需要扩展fd,稍后我们会详细介绍该函数。返回值<0,错误;返回值>0,扩展后再次进行fd的分配
if (error < 0)
goto out;
if (error) {
/*
* If we needed to expand the fs array we
* might have blocked - try again.
*/
error = -EMFILE;
goto repeat;//之前进行了扩展操作,重新进行一次空闲fd的分配
}
FD_SET(fd, fdt->open_fds);//在open_fds的位图上置位
FD_CLR(fd, fdt->close_on_exec);
fdt->next_fd = fd + 1;//next_fd加1
#if 1
/* Sanity check */
if (fdt->fd[fd] != NULL) {
printk(KERN_WARNING "get_unused_fd: slot %d not NULL!
", fd);
fdt->fd[fd] = NULL;
}
#endif
error = fd;
out:
spin_unlock(&files->file_lock);
return error;
}
current->signal->rlim[RLIMIT_NOFILE].rlim_cur是一个进程可以打开的大文件数量。我们首先来看RLIMIT_NOFILE,该值定义如下:
# define RLIMIT_NOFILE 7 /* max number of open files */
在signal结构中,rlim是struct rlimit类型的数组,
struct signal_struct {
...
struct rlimit rlim[RLIM_NLIMITS];
...
};
struct rlimit定义如下
struct rlimit {
unsigned long rlim_cur;//当前值
unsigned long rlim_max;//大值
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11