LinuxGod

LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

linux 文件描述符 (师)-unused-fdKernel:2.6.14CPUarchitecture

2023年6月4日 215点热度

linux内核中的文件描述符(四)--fd的分配--get_unused_fdKernelversion:2.6.14CPUarchitecture:ARM920920TAuthor:ce123()在linux内核中主要有两个函数涉及到文件描述符的分配:get_unused_fd和locate_fd。本文主要讲解l

linux内核中的文件描述符(四)--fd的分配--get_unused_fd

Kernelversion:2.6.14

CPUarchitecture:ARM920T

Author:ce123()

在linux内核中主要有两个函数涉及到文件描述符的分配:get_unused_fd和locate_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,扩展后再次进行fd的分配
	if (error 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!n", 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是structrlimit类型的字段linux 文件描述符,

struct signal_struct {
	...
	struct rlimit rlim[RLIM_NLIMITS];
	...	
};

structrlimit定义如下

struct rlimit {
	unsigned long	rlim_cur;//当前值
	unsigned long	rlim_max;//最大值
};

这种值时是在哪设定的呢?我们应当晓得,linux内核通过fork创建进程,第一个进程是静态定义的。为此linux 文件描述符,假如进程创建后没有更改那些值linux多线程,这么那些和第一个进程中的值应当是一样的。下边是第一个进程的task_struct结构,仅列举部份数据。

linux/arch/arm/kernel/init_task.c
struct task_struct init_task = INIT_TASK(init_task);
#define INIT_TASK(tsk)	
{									
	...
	.signal		= &init_signals,				
	...			
}

20元封顶苹果描述文件_linux 文件描述符_文件搜索 c 查找符

init_signals的定义如下:

#define INIT_SIGNALS(sig) {	
	.count		= ATOMIC_INIT(1), 		
	.wait_chldexit	= __WAIT_QUEUE_HEAD_INITIALIZER(sig.wait_chldexit),
	.shared_pending	= { 				
		.list = LIST_HEAD_INIT(sig.shared_pending.list),	
		.signal =  {{0}}}, 
	.posix_timers	 = LIST_HEAD_INIT(sig.posix_timers),		
	.cpu_timers	= INIT_CPU_TIMERS(sig.cpu_timers),		
	.rlim		= INIT_RLIMITS,					
}
includeasm-genericresource.h
#define INIT_RLIMITS							
{									
	[RLIMIT_CPU]		= {  RLIM_INFINITY,  RLIM_INFINITY },	
	[RLIMIT_FSIZE]		= {  RLIM_INFINITY,  RLIM_INFINITY },	
	[RLIMIT_DATA]		= {  RLIM_INFINITY,  RLIM_INFINITY },	
	[RLIMIT_STACK]		= {       _STK_LIM,   _STK_LIM_MAX },	
	[RLIMIT_CORE]		= {              0,  RLIM_INFINITY },	
	[RLIMIT_RSS]		= {  RLIM_INFINITY,  RLIM_INFINITY },	
	[RLIMIT_NPROC]		= {              0,              0 },	
	[RLIMIT_NOFILE]		= {       INR_OPEN,       INR_OPEN },	
	[RLIMIT_MEMLOCK]	= {    MLOCK_LIMIT,    MLOCK_LIMIT },	
	[RLIMIT_AS]		= {  RLIM_INFINITY,  RLIM_INFINITY },	
	[RLIMIT_LOCKS]		= {  RLIM_INFINITY,  RLIM_INFINITY },	
	[RLIMIT_SIGPENDING]	= { 		0,	       0 },	
	[RLIMIT_MSGQUEUE]	= {   MQ_BYTES_MAX,   MQ_BYTES_MAX },	
	[RLIMIT_NICE]		= { 0, 0 },				
	[RLIMIT_RTPRIO]		= { 0, 0 },				
}
#define NR_OPEN (1024*1024)	/* Absolute upper limit on fd num */
#define INR_OPEN 1024		/* Initial setting for nfile rlimits */

从前面的代码我们可以看见rlim_cur=1024硬盘安装linux,也就是说进程最多可以打开1024个文件。

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: fd linux系统 文件描述符
最后更新:2023年6月4日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
如何在Linux系统中查看CPU信息使用lscpu命令行 linux服务器搭建ftp的6下安装vsftpd步骤及步骤 贵州工业职业技术学院求职意向期望工作地--诚聘英才 实验1Linux安装实验掌握虚拟机的使用 Linux系统tar命令的使用方法及使用命令教程 linux 开源nas系统 杰和科技NAS服务器媒体见面会在京召开 Android与Linux开发大不同 Linux系统软件安装包:自己动手,安装不用愁 车市新战局:汽车操作系统会复制智能手机的历史吗? Linux文件系统种类 如何卸载用源码包安装的软件?在线视频教程推荐 「职位」ASP.、PHP、Linux服务器集群开发 Torvalds:Linux内核开发的创新前景充满了热情 Linux文件系统的结构从终端窗口探索Linux目录树结构 卸载软件命令Linux.You linux软件开发如何入门?学习Linux步骤及学习方法介绍 14年Linux发行版的有趣历史观点 Linux中不像Windows可以直接在控制面板中卸载? 2018年波及众多Linux发行版的性能对比会更加深入 如何用源码包安装的软件?name的方法总结
嵌入式Linux操作系统学习规划+LINUX路线,主攻江苏电信天翼校园客户端故障指引及解决办法(101)英特尔GMAGMA950显卡驱动程序/WIN8/8.1电信校园网宽带用USB数据线共享给电脑无线上网国防科大开源操作系统:它只是一个吉祥的象征10个常用Linux文本查看命令及其详细说明和使用示例Linux嵌入式系统内核裁剪与定制方法的介绍情况淘宝教育热卖C语言编程开发C++程序设计零基础入门课程从CPU、内存、硬盘、显卡等这些方面安装Linux系统的最低配置Linux通过chkconfig设置开机启动服务创建的几种常见方式(技术分析)Linux多线程的使用与操作系统的区别通常rar命令由一个主命令加若干选项(可选)构成RedHatLinux中自动运行程序中的应用linux 读写文件 关于Linux内核的神秘面纱,你知道几个?使用wget实用程序的有用命令行工具的使用怎么设置linux开机项自启动?方式是怎样的?嵌入式Linux应用层与驱动层要想学习关于Linux内核的交叉编译步骤和方法:步骤、方法STM32嵌入式linux开发流程及应用程序分析-STMlinux下有哪些文件在介绍lsof命令实用用法介绍?
Linux游戏起源于最受欢迎的游戏平台:SteamOS介绍 Linux软件安装目录及位置4种方法(服务器学习) VMware虚拟机下载与安装-Passerby-Wang的博客-CSDN 为什么我们还要使用一键DD重装/更换系统呢?? 使用u盘在IBMx3650服务器上安装linux系统?我猜两种情况 Linux下如何定时执行php脚本? 红旗Linux桌面版4.0从软盘启动硬盘最详细的安装图解 一份最佳终端模拟器列表,可以在单个窗口中打开多个终端的终端怎么办? 搜狗输入法Linux版更新v1.0.0018 编程之家 Linux定时器的使用内核定时器是内核用来控制在未来某个时间点 Linux内核技术交流群--一下Linux的核心目录结构 嵌入式Linux应用开发完全手册代码2.能写简单汇编代码 学习Linux最简单、最实用的环境就是虚拟机环境(上) TinyCore3.1——世界上最小的Linux桌面发行版 怎样在Linux中查找进程的PID和PPID什么是Linux进程ID 创建f1的一个符号连接文件(Linux链接) 查看动态库版本查找gcc生成的最新动态库方法 绪论:100小时定律已成,现今将之前所学知识温顾 RedHatLinux62初级读者入手经验分享
标签聚合
软件 操作 linux系统 文件 文件目录 内核 命令 虚拟机 linux服务器 应用
书籍
课程
技术群
技术干货大合集↓
  • 2023年9月 / 78篇
  • 2023年8月 / 93篇
  • 2023年7月 / 94篇
  • 2023年6月 / 90篇
  • 2023年5月 / 93篇
  • 2023年4月 / 90篇
  • 2023年3月 / 129篇
  • 2023年2月 / 84篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.