Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >聊聊Posix语义之open和close系统调用

聊聊Posix语义之open和close系统调用

作者头像
用户4700054
发布于 2022-08-17 04:59:58
发布于 2022-08-17 04:59:58
99500
代码可运行
举报
运行总次数:0
代码可运行

系统调用

  • linux下任何进程针对文件类打开和释放资源大部分 都会涉及到系统调用,这里是针对文件相关的系统调用openclose.linux下open一个文件是返回的是一个文件描述符,这个文件描述符关联一个struct file,struct file是通过文件inode初始化而来;close系统调用把进程关联的fd对应的struct file资源给释放了,同时flush这个struct file对应的inode信息到磁盘。整个openclose操作都是通过system call->vfs->ext4这样的路径来执行。

Posix之open

  • open根据用户态进程传入的文件路径名称打来文件,创建文件的struct file结构体,并将进程的申请的空闲文件描述符和struct file进行关联,然后返回这个文件描述符给用户态进程来完成操作。
  • open系统调用的整个函数流程如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 进入系统调用
do_sys_open
	// 本进程内部申请一个空闲的fd
	get_unused_fd_flags
	// 根据open参数遍历并且通过inode初始化struct file
	do_filp_open
		// 根据路径名称定为文件dentry和目标文件的inode,返回struct file
		path_openat
				// 申请struct file
				alloc_empty_file
				// 准备查找路径起点
				path_init
				// 逐级路径解析,并且查找
				link_path_walk
						// 本层文件路径查找
						walk_component
								// 在dcache中查找					
								lookup_fast
								// 读取具体的磁盘进行查找
								lookup_slow
				// ext4查找目标文件的inode
				ext4_lookup
					ext4_find_entry
				// 目标文件inode创建
				ext4_create
					__ext4_new_inode	
	// 把fd打开的struct file关联起来								
	fd_install

Posix之close

  • close系统调用涉及到进程内部fdstruct file解绑,同时需要释放fdstruct file结构,同时需要flushinode的相关数据。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// close系统调用
ksys_close
		// 释放fd,解绑struct file,同时flush inode
		__close_fd
				// 获取fd对应的struct file,解绑fd和struct file关系,调用方法释放资源(fd)
				files_fdtable
				// 调用struct file->f_op的flush方法,更新inode数据,最后释放struct file
				filp_close
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static inline int ksys_close(unsigned int fd)
{
	return __close_fd(current->files, fd);
}

int __close_fd(struct files_struct *files, unsigned fd)
{
	struct file *file;
	struct fdtable *fdt;

	spin_lock(&files->file_lock);
	// 获取文件描述符表
	fdt = files_fdtable(files);
	if (fd >= fdt->max_fds)
		goto out_unlock;
	// 获取fd对应的fd
	file = fdt->fd[fd];
	if (!file)
		goto out_unlock;
	rcu_assign_pointer(fdt->fd[fd], NULL);
	// 释放fd资源,设置为可用
	__put_unused_fd(files, fd);
	spin_unlock(&files->file_lock);
	// 调用struct file->f_op的flush方法,更新对应的inode
	return filp_close(file, files);

out_unlock:
	spin_unlock(&files->file_lock);
	return -EBADF;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 存储内核技术交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux|IO|File IO源码剖析
文件的open、close、read、write是最基本的文件抽象,描述了对于设备的操作。本文将结合用户态的接口以及内核态的实现剖析文件IO。
朝闻君
2021/11/22
3.7K0
Linux|IO|File IO源码剖析
聊聊Posix语义之读写系统调用
基本介绍 linux内核在读写数据时候,可能会发生短暂的停顿等待磁盘数据 ,本质原因是进程发起read/write系统调用时候,由用户态切换到内核态,进程会经历磁盘数据达到后而引起的中断和从中断点继续执行的两个步骤。进程进入中断后,内核把磁盘数据的读写请求是交给了磁盘,磁盘硬件完成读写操作后发起硬中断唤醒被IO 中断的进程,继续执行后续的操作。 read/write系统调用需要三个参数,第一个是文件描述符fd,第二个是内存缓冲区buf,第三个是读写的字节数。read/write系统调用由用户态进程发起,然后
用户4700054
2022/08/17
1.1K0
聊聊Posix语义之读写系统调用
从linux源码看socket的close
笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。上篇博客讲了socket的阻塞和非阻塞,这篇就开始谈一谈socket的close(以tcp为例且基于linux-2.6.24内核版本)
无毁的湖光-Al
2018/08/14
5.5K0
从linux源码看socket的close
谈谈 Linux 文件系统
最近在看一本 Linux 环境编程的书,加上之前工作中接触了一些关于存储的东西,便突然有兴趣整理一下 Linux 是怎么支撑文件系统的。
CS实验室
2021/07/14
4.7K0
谈谈 Linux 文件系统
Linux select poll源码剖析
poll机制是所有多路转接的共性;调用控制块(struct poll_wqueues)与监听事件项(struct poll_table_entry)是select()与poll()的共性;事件描述集(fdset)与事件描述符(struct pollfd)是select()与poll()的特性。
233333
2022/05/09
3.2K0
Linux tcp/ip 源码分析 - close
该方法先通过fd找到对应的file,再调用filp_close方法对file进行close。
KINGYT
2019/06/03
2.3K0
虚拟文件系统源码解析之open(基于linux1.2.13)
我们操作一个文件之前都需要先open一下。我们看看open在虚拟文件系统中大致的执行过程。不会分析具体的过程。主要分析一下虚拟文件系统的实现原理。
theanarkh
2019/12/18
7430
OpenHarmony 内核源码分析(VFS篇) | 文件系统和谐共处的基础
VFS(Virtual File System)是文件系统的虚拟层,它不是一个实际的文件系统,而是一个异构文件系统之上的软件粘合层,为用户提供统一的类Unix文件操作接口。由于不同类型的文件系统接口不统一,若系统中有多个文件系统类型,访问不同的文件系统就需要使用不同的非标准接口。而通过在系统中添加VFS层,提供统一的抽象接口,屏蔽了底层异构类型的文件系统的差异,使得访问文件系统的系统调用不用关心底层的存储介质和文件系统类型,提高开发效率。
小帅聊鸿蒙
2025/03/28
430
OpenHarmony 内核源码分析(VFS篇) | 文件系统和谐共处的基础
存储基础 — 文件描述符 fd 究竟是什么?
通过上篇 Go 存储基础 — 文件 IO 的姿势, 我们看到有两种文件读写的方式,一种是系统调用的方式,操作的对象是一个整数 fd,另一种是 Go 标准库自己封装的标准库 IO ,操作对象是 Go 封装的 file 结构体,但其内部还是针对整数 fd 的操作。所以一切的本源是通过 fd 来操作的,那么,这个 fd 究竟是什么?就这个点我们深入剖析。
IOT物联网小镇
2021/05/13
2.8K0
存储基础 — 文件描述符 fd 究竟是什么?
虚拟文件系统
通常我们使用的磁盘和光盘都属于块设备,也就是说它们都是按照 数据块 来进行读写的,可以把磁盘和光盘想象成一个由数据块组成的巨大数组。但这样的读写方式对于人类来说不太友好,所以一般要在磁盘或者光盘上面挂载 文件系统 才能使用。那么什么是 文件系统 呢? 文件系统 是一种存储和组织数据的方法,它使得对其访问和查找变得容易。通过挂载文件系统后,我们可以使用如 /home/docs/test.txt 的方式来访问磁盘中的数据,而不用使用数据块编号来进行访问。
用户7686797
2020/08/25
1.6K0
聊聊文件系统的原理
文件系统的作用 linux 内核中进程管理、内存管理、网络协议栈、文件系统是内核的四大核心模块。其中文件系统提供最基础的操作文件的能力。简单概要的说,内核中有vfs和实际文件系统(比如ext4),vfs是虚拟文件系统,是内核提供一种工厂设计模式的抽象层,对外提供标准的posix语义层;实际文件系统就是实现特定的文件功能的磁盘文件系统。具体如下图所描述 文件系统的IO协议栈 应用程序如果以dio方式读写文件请求,首先经过内核的vfs,然后到实际的文件系统的对应的处理函数,接着请求进入那么设备映射,最后
用户4700054
2022/08/17
8750
聊聊文件系统的原理
OpenHarmony 内核源码分析(文件句柄篇) | 你为什么叫句柄?
只要写过应用程序代码操作过文件不会陌生这几个函数,文件操作的几个关键步骤嘛,跟把大象装冰箱分几步一样.先得把冰箱门打开,再把大象放进去,再关上冰箱门.其中最重要的一个参数就是fd,应用程序所有对文件的操作都基于它.fd可称为文件描述符,或者叫文件句柄(handle),个人更愿意称后者. 因为更形象,handle英文有手柄的意思,跟开门一样,握住手柄才能开门,手柄是进门关门的抓手.映射到文件系统,fd是应用层出入内核层的抓手.句柄是一个数字编号, open | creat去申请这个编号,内核会创建文件相关的一系列对象,返回编号,后续通过编号就可以操作这些对象.原理就是这么的简单,本篇将从fd入手,跟踪文件操作的整个过程.
小帅聊鸿蒙
2025/03/30
890
xv6(13) 文件系统:文件描述符&系统调用
本文需要接着系统调用,也是接着 $xv6$ 文件系统的最后一层,讲述各种具体的文件系统调用是怎么实现的,文件描述符,$inode$,文件之间到底有什么关系,创建打开关闭删除文件到底是何意义,文件删除之后数据就不存在了吗,链接又作何解释等等问题,看完本文相信你能找到答案。
rand_cs
2023/12/06
6570
linux系统调用之sys_close(基于linux0.11)
进程PCB中有一个指针数组,文件描述符是数组索引,每个元素指向一个file结构体,file结构体有一个字段指向文件对应的inode。关闭一个文件主要的步骤是 1 根据文件描述符,把指针数组对应项置空。 2 如果指向的file结构也没有其他进程使用了,则file结构体可以重用。但是他指向的inode节点需要回写到硬盘。具体参考iput函数。
theanarkh
2019/05/14
3.1K0
【高级编程】Linux read系统调用
最近一个项目做了一个模拟u盘的设备,但是在read虚拟u盘的内容时必须每次都从磁盘内读取,而不是从系统的cache中读取,由于这个问题,就查资料看了下read的系统调用,以及文件系统的一些内容。由于文件系统涉及面较广,例如虚拟文件系统(VFS),页缓存,块缓存,数据同步等内容,不可能全部分析到位,这里只记录和read有关的两种使用方式。cached IO和direct IO。 1. 什么是系统调用 首先系统调用能做那些事呢?概括来说,大概有下面这些事需要系统调用来实现。 控制硬件:系统调用往往作为硬件资源和
程序员互动联盟
2018/03/13
6.3K0
【高级编程】Linux read系统调用
[操作系统] 基础IO:系统文件I/O
在 Linux 操作系统中,文件 I/O(输入/输出)是程序与文件系统交互的基础。理解文件 I/O 的工作原理对于编写高效、可靠的程序至关重要。本文将深入探讨系统文件 I/O 的机制。
DevKevin
2025/02/17
430
[操作系统] 基础IO:系统文件I/O
内核文件系统挂载和Open文件
ext4挂载 在linux 5.x的内核中,实际文件系统的挂载采用新的挂载API,引入了struct fs_context用于内部文件系统挂载的信息。 应用端发起mount命令,进入mount系统调用,执行do_mount的函数 // vfs层保留该小节需要的核心字段 struct super_block { // 文件系统类型 struct file_system_type *s_type; // 文件系统super_block的操作函数 const struct super_operations
用户4700054
2022/08/17
1.1K0
从linux源码看epoll
在linux的高性能网络编程中,绕不开的就是epoll。和select、poll等系统调用相比,epoll在需要监视大量文件描述符并且其中只有少数活跃的时候,表现出无可比拟的优势。epoll能让内核记住所关注的描述符,并在对应的描述符事件就绪的时候,在epoll的就绪链表中添加这些就绪元素,并唤醒对应的epoll等待进程。 本文就是笔者在探究epoll源码过程中,对kernel将就绪描述符添加到epoll并唤醒对应进程的一次源码分析(基于linux-2.6.32内核版本)。由于篇幅所限,笔者聚焦于tcp协议下socket可读事件的源码分析。
无毁的湖光-Al
2019/03/12
5.3K0
从linux源码看epoll
VFS四大对象之四-struct file
继上一篇文章: http://yehe.isd.com/column/support-plan/article-edit/93709 四、file结构体 文件对象:注意文件对象描述的是进程已经打开的文件。因为一个文件可以被多个进程打开,所以一个文件可以存在多个文件对象。但是由于文件是唯一的,那么inode就是唯一的,目录项也是定的! 进程其实是通过文件描述符来操作文件的,注意每个文件都有一个32位的数字来表示下一个读写的字节位置,这个数字叫做文件位置。 565 struct file { 566
233333
2018/03/07
2.7K0
深入了解epoll模型 -- 开卷有益
上网一搜epoll,基本是这样的结果出来:《多路转接I/O – epoll模型》,万变不离这个标题。 但是呢,不变的事物,我们就更应该抓出其中的重点了。 多路、转接、I/O、模型。 别急,先记住这几个词,我比较喜欢你们看我文章的时候带着问题。
看、未来
2022/05/06
7370
深入了解epoll模型 -- 开卷有益
相关推荐
Linux|IO|File IO源码剖析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验