当前位置: 首页 > news >正文

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)来实现不同的操作。

下面是该函数的作用和代码实现的解释:

  1. 首先,它检查给定的文件描述符(fd)是否有效,即必须小于已打开文件描述符的最大数目(NR_OPEN),并且与当前进程的文件描述符表中的相应条目(current->filp[fd])关联。

  2. 如果文件描述符无效,函数返回错误码 -EBADF(-9:无效的文件描述符)。

  3. 根据传递的命令(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_GETLKF_SETLKF_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返回当前值最小的未用句柄&#xff0c;dup2返回指定新句柄的数值&#xff0c;句柄的复制操作主要用在文件的标准输入、输出重定向和管道方面。 dupfd 复制文件句柄&#xff…...

OpenStack简介

OpenStack简介 目录 OpenStack简介 1、云计算模式2、云计算 虚拟化 openstack之间的关系&#xff1f;3、OpenStack 中有哪些组件&#xff1f;4、计算节点负责虚拟机运行5、网络节点负责对外网络与内网之间的通信 5.1 网络节点仅包含Neutron服务5.2 网络节点包含三个网络端口6、…...

二分法的应用

文章目录 什么是二分法&#x1f3ae;二分查找的优先级二分查找的步骤&#x1f4a5;图解演示&#x1f9e9; 代码演示&#x1fad5;python程序实现&#x1f408;‍⬛C程序实现&#x1f415;‍&#x1f9ba;C程序实现&#x1f42f;Java程序实现&#x1f433; 非常规类二分查找&…...

ChatGPT在大规模数据处理和信息管理中的应用如何?

ChatGPT作为一种强大的自然语言处理模型&#xff0c;在大规模数据处理和信息管理领域有着广泛的应用潜力。它可以利用其文本生成、文本理解和问答等能力&#xff0c;为数据分析、信息提取、知识管理等任务提供智能化的解决方案。以下将详细介绍ChatGPT在大规模数据处理和信息管…...

【算法篇C++实现】五大常规算法

文章目录 &#x1f680;一、分治法⛳&#xff08;一&#xff09;算法思想⛳&#xff08;二&#xff09;相关代码 &#x1f680;二、动态规划算法⛳&#xff08;一&#xff09;算法思想⛳&#xff08;二&#xff09;相关代码 &#x1f680;三、回溯算法⛳&#xff08;一&#xf…...

MySQL和钉钉单据接口对接

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

layui的基本使用-日期控件的业务场景使用入门实战案例一

效果镇楼&#xff1b; 1 前端UI层面&#xff1b; <!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

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

Apache2.4源码安装与配置

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

Flume原理剖析

一、介绍 Flume是一个高可用、高可靠&#xff0c;分布式的海量日志采集、聚合和传输的系统。Flume支持在日志系统中定制各类数据发送方&#xff0c;用于收集数据&#xff1b;同时&#xff0c;Flume提供对数据进行简单处理&#xff0c;并写到各种数据接受方&#xff08;可定制&…...

【leetcode】202. 快乐数(easy)

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#xff0c…...

如何用瀑布图分析公司年报

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

Asynq: 基于Redis实现的Go生态分布式任务队列和异步处理库

Asynq[1]是一个Go实现的分布式任务队列和异步处理库&#xff0c;基于redis&#xff0c;类似Ruby的sidekiq[2]和Python的celery[3]。Go生态类似的还有machinery[4]和goworker 同时提供一个WebUI asynqmon[5]&#xff0c;可以源码形式安装或使用Docker image, 还可以和Prometheus…...

保证率计算公式 正态分布

在正态分布中&#xff0c;如果我们要计算一个给定区间内的保证率&#xff0c;可以使用下面的计算公式&#xff1a; 找到给定保证率对应的标准正态分布的z值。可以使用标准正态分布表或计算器进行查询。例如&#xff0c;对于95%的保证率&#xff0c;对应的z值为1.96。 使用z值和…...

docker容器监控:Cadvisor+InfluxDB+Grafana的安装部署

目录 CadvisorInfluxDBGrafan安装部署 1、安装docker-ce 2、阿里云镜像加速器 3、下载组件镜像 4、创建自定义网络 5、创建influxdb容器 6、创建Cadvisor 容器 7、查看Cadvisor 容器&#xff1a; &#xff08;1&#xff09;准备测试镜像 &#xff08;2&#xff09;通…...

论文讲解——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"&#xff0c;似乎是靠[formControlName]"control.controlInstance"来关联的。 <form nz-form [formGroup]"validateForm" (ngSubmit)"submitForm()"><nz-form-item *ngFor&quo…...

第十七次CCF计算机软件能力认证

第一题&#xff1a;小明种苹果 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) 第二题&#xff1a;小明种苹…...

ApplicationContext在Spring Boot中是如何创建的?

一、ApplicationContext在Spring Boot中是如何创建的&#xff1f; 1. SpringApplication ApplicationContextFactory有三个实现类&#xff0c;分别是AnnotationConfigReactiveWebServerApplicationContext.Factory、AnnotationConfigServletWebServerApplicationContext.Facto…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; 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&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 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的深度集成引发兴奋与担忧

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