Linux0.11内核源码解析-fcntl.c/iotcl.c/stat.c
fcntl
fcntl.c实现了文件控制系统调用fcntl和两个文件句柄描述符的复制系统调用dup()和dup2()。
dup返回当前值最小的未用句柄,dup2返回指定新句柄的数值,句柄的复制操作主要用在文件的标准输入、输出重定向和管道方面。
dupfd
复制文件句柄,参数fd是要复制的文件句柄,arg是新文件句柄的最小数值,返回值是新文件句柄或者错误码
static int dupfd(unsigned int fd, unsigned int arg)
{if (fd >= NR_OPEN || !current->filp[fd])return -EBADF;if (arg >= NR_OPEN)return -EINVAL;//查找空闲的文件句柄while (arg < NR_OPEN)if (current->filp[arg])arg++;elsebreak;if (arg >= NR_OPEN)return -EMFILE;
//清除进程的 close_on_exec 位图中的特定位。close_on_exec 是一个位图,用于记录在执行 exec 系统调用时是否关闭相应的文件描述符。current->close_on_exec &= ~(1<<arg);(current->filp[arg] = current->filp[fd])->f_count++;return arg;
}
dup2和dup的实现
int sys_dup2(unsigned int oldfd, unsigned int newfd)
{sys_close(newfd);return dupfd(oldfd,newfd);
}int sys_dup(unsigned int fildes)
{return dupfd(fildes,0);
}
sys_fcntl
的函数
实现了 fcntl
系统调用的功能。fcntl
系统调用用于对打开文件描述符进行操作和控制,通过传递不同的命令(cmd
)来实现不同的操作。
下面是该函数的作用和代码实现的解释:
-
首先,它检查给定的文件描述符(
fd
)是否有效,即必须小于已打开文件描述符的最大数目(NR_OPEN
),并且与当前进程的文件描述符表中的相应条目(current->filp[fd]
)关联。 -
如果文件描述符无效,函数返回错误码
-EBADF
(-9:无效的文件描述符)。 -
根据传递的命令(
cmd
)参数,执行不同的操作:F_DUPFD
:如果命令是F_DUPFD
,则调用dupfd
函数来复制给定的文件描述符(fd
)到最小的可用文件描述符号(arg
)。F_GETFD
:如果命令是F_GETFD
,则返回当前进程的close_on_exec
位图中对应文件描述符的状态(即该文件描述符在exec
执行时是否会被关闭)。F_SETFD
:如果命令是F_SETFD
,则根据参数arg
将当前进程的close_on_exec
位图中对应文件描述符的状态进行设置,即设置或清除该文件描述符在exec
执行时是否会被关闭的标志位。F_GETFL
:如果命令是F_GETFL
,则返回与给定文件描述符关联的文件状态标志。F_SETFL
:如果命令是F_SETFL
,则根据参数arg
对给定文件描述符关联的文件状态标志进行设置,例如设置或清除非阻塞(O_NONBLOCK)和追加(O_APPEND)等标志位。- 其他命令(
F_GETLK
、F_SETLK
、F_SETLKW
):该函数返回 -1,表示不支持给定的命令。
int sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg)
{ struct file * filp;if (fd >= NR_OPEN || !(filp = current->filp[fd]))return -EBADF;switch (cmd) {case F_DUPFD:return dupfd(fd,arg);case F_GETFD:return (current->close_on_exec>>fd)&1;case F_SETFD:if (arg&1)current->close_on_exec |= (1<<fd);elsecurrent->close_on_exec &= ~(1<<fd);return 0;case F_GETFL:return filp->f_flags;case F_SETFL:filp->f_flags &= ~(O_APPEND | O_NONBLOCK);filp->f_flags |= arg & (O_APPEND | O_NONBLOCK);return 0;case F_GETLK: case F_SETLK: case F_SETLKW:return -1;default:return -1;}
}
ioctl
ioctl.c文件实现了输入、输出控制系统调用ioctl,主要调用tty_ioctl函数,对终端IO进行控制
extern int tty_ioctl(int dev, int cmd, int arg);typedef int (*ioctl_ptr)(int dev,int cmd,int arg);#define NRDEVS ((sizeof (ioctl_table))/(sizeof (ioctl_ptr)))static ioctl_ptr ioctl_table[]={NULL, /* nodev */NULL, /* /dev/mem */NULL, /* /dev/fd */NULL, /* /dev/hd */tty_ioctl, /* /dev/ttyx */tty_ioctl, /* /dev/tty */NULL, /* /dev/lp */NULL}; /* named pipes */int sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
{ struct file * filp;int dev,mode;if (fd >= NR_OPEN || !(filp = current->filp[fd]))return -EBADF;//判断文件类型mode=filp->f_inode->i_mode;if (!S_ISCHR(mode) && !S_ISBLK(mode))return -EINVAL;//获取设备号dev = filp->f_inode->i_zone[0];if (MAJOR(dev) >= NRDEVS)return -ENODEV;if (!ioctl_table[MAJOR(dev)])return -ENOTTY;//对应ioctl_table函数指针表中没有对应函数,则返回出错码return ioctl_table[MAJOR(dev)](dev,cmd,arg);
}
stat
实现了取文件信息状态系统调用stat和fstat,并将信息存放用户的文件状态结果缓冲区中
cp_stat复制文件状态信息
static void cp_stat(struct m_inode * inode, struct stat * statbuf)
{struct stat tmp;int i;//验证存放数据的内存空间verify_area(statbuf,sizeof (* statbuf));tmp.st_dev = inode->i_dev;tmp.st_ino = inode->i_num;tmp.st_mode = inode->i_mode;tmp.st_nlink = inode->i_nlinks;tmp.st_uid = inode->i_uid;tmp.st_gid = inode->i_gid;tmp.st_rdev = inode->i_zone[0];tmp.st_size = inode->i_size;tmp.st_atime = inode->i_atime;tmp.st_mtime = inode->i_mtime;tmp.st_ctime = inode->i_ctime;//复制状态信息到用户缓冲区for (i=0 ; i<sizeof (tmp) ; i++)put_fs_byte(((char *) &tmp)[i],&((char *) statbuf)[i]);
}
sys_stat根据文件名获取文件状态信息
int sys_stat(char * filename, struct stat * statbuf)
{struct m_inode * inode;//根据文件名找出对应的i节点if (!(inode=namei(filename)))return -ENOENT;cp_stat(inode,statbuf);iput(inode);return 0;
}
sys_fstat根据文件描述符获取文件状态信息
int sys_fstat(unsigned int fd, struct stat * statbuf)
{struct file * f;struct m_inode * inode;if (fd >= NR_OPEN || !(f=current->filp[fd]) || !(inode=f->f_inode))return -EBADF;cp_stat(inode,statbuf);return 0;
}
相关文章:
Linux0.11内核源码解析-fcntl.c/iotcl.c/stat.c
fcntl fcntl.c实现了文件控制系统调用fcntl和两个文件句柄描述符的复制系统调用dup()和dup2()。 dup返回当前值最小的未用句柄,dup2返回指定新句柄的数值,句柄的复制操作主要用在文件的标准输入、输出重定向和管道方面。 dupfd 复制文件句柄ÿ…...
OpenStack简介
OpenStack简介 目录 OpenStack简介 1、云计算模式2、云计算 虚拟化 openstack之间的关系?3、OpenStack 中有哪些组件?4、计算节点负责虚拟机运行5、网络节点负责对外网络与内网之间的通信 5.1 网络节点仅包含Neutron服务5.2 网络节点包含三个网络端口6、…...

二分法的应用
文章目录 什么是二分法🎮二分查找的优先级二分查找的步骤💥图解演示🧩 代码演示🫕python程序实现🐈⬛C程序实现🐕🦺C程序实现🐯Java程序实现🐳 非常规类二分查找&…...
ChatGPT在大规模数据处理和信息管理中的应用如何?
ChatGPT作为一种强大的自然语言处理模型,在大规模数据处理和信息管理领域有着广泛的应用潜力。它可以利用其文本生成、文本理解和问答等能力,为数据分析、信息提取、知识管理等任务提供智能化的解决方案。以下将详细介绍ChatGPT在大规模数据处理和信息管…...

【算法篇C++实现】五大常规算法
文章目录 🚀一、分治法⛳(一)算法思想⛳(二)相关代码 🚀二、动态规划算法⛳(一)算法思想⛳(二)相关代码 🚀三、回溯算法⛳(一…...

MySQL和钉钉单据接口对接
MySQL和钉钉单据接口对接 数据源系统:钉钉 钉钉(DingTalk)是阿里巴巴集团打造的企业级智能移动办公平台,是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工牌…...

layui的基本使用-日期控件的业务场景使用入门实战案例一
效果镇楼; 1 前端UI层面; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…...

【2.1】Java微服务:详解Hystrix
✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: Java微服务 ✨特色专栏: 知识分享 &am…...

Apache2.4源码安装与配置
环境准备 openssl-devel pcre-devel expat-devel libtool gcc libxml2-devel 这些包要提前安装,否则httpd编译安装时候会报错 下载源码、解压缩、软连接 1、wget下载[rootnode01 ~]# wget https://downloads.apache.org/httpd/httpd-2.4.57.tar.gz --2023-07-20 …...

Flume原理剖析
一、介绍 Flume是一个高可用、高可靠,分布式的海量日志采集、聚合和传输的系统。Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(可定制&…...
【leetcode】202. 快乐数(easy)
编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1,…...

如何用瀑布图分析公司年报
原创: MicroStrategy微策略中国 , Jiping Sun 微策略企业级数据分析与移动应用9月21日2018年 摘要:利用达析报告开箱即用的瀑布图来展示各个度量值如何增加或减少。下载MicroStrategy Desktop 10.11以上版本,自己动手创建瀑布图。 瀑布图是由…...

Asynq: 基于Redis实现的Go生态分布式任务队列和异步处理库
Asynq[1]是一个Go实现的分布式任务队列和异步处理库,基于redis,类似Ruby的sidekiq[2]和Python的celery[3]。Go生态类似的还有machinery[4]和goworker 同时提供一个WebUI asynqmon[5],可以源码形式安装或使用Docker image, 还可以和Prometheus…...
保证率计算公式 正态分布
在正态分布中,如果我们要计算一个给定区间内的保证率,可以使用下面的计算公式: 找到给定保证率对应的标准正态分布的z值。可以使用标准正态分布表或计算器进行查询。例如,对于95%的保证率,对应的z值为1.96。 使用z值和…...

docker容器监控:Cadvisor+InfluxDB+Grafana的安装部署
目录 CadvisorInfluxDBGrafan安装部署 1、安装docker-ce 2、阿里云镜像加速器 3、下载组件镜像 4、创建自定义网络 5、创建influxdb容器 6、创建Cadvisor 容器 7、查看Cadvisor 容器: (1)准备测试镜像 (2)通…...

论文讲解——TPU-MLIR: A Compiler For TPU Using MLIR
论文讲解——TPU-MLIR: A Compiler For TPU Using MLIR https://arxiv.org/pdf/2210.15016.pdf概览模型转换TranslationCanonicalizeLoweringLayerGroup BufferizationCalibration QuantizationCorrectness Check相关资料 https://arxiv.org/pdf/2210.15016.pdf 本文将对TPU…...

基于最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇系统性实践技能提升
查看原文>>>基于最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇系统性实践技能提升 目录 专题一、生态环评报告编制规范 专题二、土地利用图 专题三、植被类型及植被覆盖度图 专题四、物种适宜生境分布图 专题五、生物多样性测定 专题六…...

NGZORRO:动态表单/模型驱动 的相关问题
官网的demo的[nzFor]"control.controlInstance",似乎是靠[formControlName]"control.controlInstance"来关联的。 <form nz-form [formGroup]"validateForm" (ngSubmit)"submitForm()"><nz-form-item *ngFor&quo…...
第十七次CCF计算机软件能力认证
第一题:小明种苹果 n , m map(int , input().split()) t , k , p 0 , 0 , -1 for _ in range(n):l list(map(int , input().split()))t sum(l)x -sum(l[i] for i in range(1 , len(l)))if x > p:p xk _ 1 print(t , k , p) 第二题:小明种苹…...

ApplicationContext在Spring Boot中是如何创建的?
一、ApplicationContext在Spring Boot中是如何创建的? 1. SpringApplication ApplicationContextFactory有三个实现类,分别是AnnotationConfigReactiveWebServerApplicationContext.Factory、AnnotationConfigServletWebServerApplicationContext.Facto…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...