文件IO_打开和关闭文件(附Linux-5.15.10内核源码分析)

news2024/12/23 15:04:46

目录

1.打开文件

1.1 函数原型介绍

1.1.1 open函数

1.1.2 creat函数

1.1.2 openat函数

1.2 内核源码分析

1.3 函数原型区别

2.关闭文件

2.1 函数原型介绍

2.1.1 close函数

2.2 内核源码实现


1.打开文件

1.1 函数原型介绍

1.1.1 open函数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

函数简介:open函数用于打开一个文件,并返回一个文件描述符,应用程序可以通过文件描述符对文件进行读写等操作。open函数可以打开已经存在的文件,也可以创建一个新文件。

函数参数:

pathname:是文件的路径名。

flags:打开文件时的标志,可以设置为以下值之一或多个值的按位或:

  • O_RDONLY:只读打开
  • O_WRONLY:只写打开
  • O_RDWR:读写打开
  • O_CREAT:如果文件不存在,则创建文件
  • O_TRUNC:如果文件存在且以写方式打开,则截断文件为零长度
  • O_APPEND:以追加方式打开文件

mode:只有在O_CREAT标志被设置时才有效,用于指定文件的访问权限,可以设置为以下值之一:

#define S_IRWXU 00700 //用户可读,可写,可执行
#define S_IRUSR 00400 //用户可读
#define S_IWUSR 00200 //用户可写
#define S_IXUSR 00100 //用户可执行

#define S_IRWXG 00070 //组可读,可写,可执行
#define S_IRGRP 00040 //组可读
#define S_IWGRP 00020 //组可写
#define S_IXGRP 00010 //组可执行

#define S_IRWXO 00007 //其他用户可读,可写,可执行
#define S_IROTH 00004 //其他用户可读
#define S_IWOTH 00002 //其他用户可写
#define S_IXOTH 00001 //其他用户可执行

mode可以通过八进制赋值,例如设置为0777,0777表示所有权限按位或。

需要注意的是mode需要与系统umask值共同作用才能得到最终的文件权限,umask作用去掉哪些权限,比如umask值为0022(八进制),标识去掉S_IWGRP和S_IWOTH权限。

文件最终权限计算方法为: mode &~ umask.

举例说明:

mode设置为0777,umask值为0022,文件最终权限为0755。

函数返回值:

成功:返回文件描述符,文件描述符为非负整数。

失败:返回-1,并设置errno。

示例代码

#define TEST_FILE "/tmp/test.txt"

int open_test() {
    int fd = open(TEST_FILE, O_RDWR | O_CREAT | O_TRUNC, 0777);
    if (fd == -1) {
        perror("open error");
        return -1;
    }
    return 0;
}

1.1.2 creat函数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int creat(const char *pathname, mode_t mode);

函数简介:creat函数用于创建并打开一个新文件,并返回一个文件描述符,如果文件已经存在,则会将其截断为0字节,应用程序可以通过文件描述符对文件进行读写等操作。

函数参数:

pathname:文件路径名。

mode:是新文件的权限(参考open函数)。

函数返回值:

成功:返回文件描述符,文件描述符为非负整数。

失败:返回-1,并设置errno。

示例代码:

int creat_test() {
    int fd = creat(TEST_FILE, 0644);
    if (fd == -1) {
        perror("creat error");
        return -1;
    }
    return 0;
}

1.1.2 openat函数

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int openat(int dirfd, const char *pathname, int flags);
int openat(int dirfd, const char *pathname, int flags, mode_t mode);

函数简介:openat函数用于在指定目录下打开文件并返回文件描述符。它与open函数类似,但可以指定相对路径来打开文件,而不需要提供完整的文件路径。

函数参数:

dirfd:已打开的文件目录描述符。

pathname:是指定文件名的字符串。

flags:打开文件时的标志(参考open函数)。

mode:是新文件的权限(参考open函数)。

openat函数dirfd和pathname参数组合关系:

  • 组合1:pathname为绝对路径时,按绝对路径方式打开文件,dirfd失效。
  • 组合2:pathname为相对路径时,由dirfd(文件目录)和pathname(相对路径)共同决定打开的文件名。
  • 组合3:pathname为相对路径时,如果dirfd设置为AT_FDCWD(当前工作目录),由dirfd(当前工作目录)和pathname(相对路径)共同决定打开的文件名。

函数返回值:

成功:返回文件描述符,文件描述符为非负整数。

失败:返回-1,并设置errno。

示例代码:

#define DIR_PATH "/tmp"
#define FILE "test.txt"
int openat_test() {
    int dirfd = open(DIR_PATH, O_RDONLY);
    if (dirfd == -1) {
        perror("open dir error");
        return -1;
    }

    int fd = openat(dirfd, FILE, O_RDWR | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("openat error");
        return -1;
    }
    return 0;
}

1.2 内核源码分析

图 1-1 open函数内核源码分析

open,creat,openat通过系统调用再调用一个共同的函数do_sys_open函数,do_sys_open函数有四个参数:dfd,path,flags,mode。这四个参数对应openat函数原型四个参数。

open函数没有dfd参数,所以在调用do_sys_open函数之前dfd设置为默认值AT_FDCWD(当前工作目录)。

creat函数没有dfd参数和flags参数,所以在调用do_sys_open函数之前dfd设置为默认值AT_FDCWD(当前工作目录),以及flags设置为默认值O_WRONLY | O_CREAT | O_TRUNC,creat因为flags默认值的关系,所以只能新建文件或者截断文件长度至0来打开文件。

openat函数需要传递四个参数至do_sys_open函数。

打开文件描述符系列函数源码调用路径如图,这里就不再赘述。

1.3 函数原型区别

 (1)open函数和creat函数区别

  • 区别1:open函数可以打开已存在的文件,也可以创建新文件,而creat函数只能创建新文件。如果文件已存在,creat函数会将其截断为零长度。
  • 区别2:open函数的标志参数可以更加灵活地指定文件的打开方式,包括只读、只写、读写、追加等选项。而creat函数只能以写方式打开文件,并且具有固定的标志(O_WRONLY | O_CREAT | O_TRUNC)。

(2)open函数和openat函数区别

  • 区别1:open函数接受一个文件路径名作为参数,该路径名可以是绝对路径或相对路径。 openat函数需要传递一个已打开的目录文件描述符(dirfd)和一个相对于该目录的路径名作为参数。这种方式可以更加灵活地控制文件的打开位置。
  • 区别2:目录解析方式: open函数的文件路径名会根据当前进程的工作目录进行解析。 openat函数的路径名是相对于提供的目录文件描述符(dirfd)进行解析。
  • 区别3:安全性考虑: open函数在解析文件路径时,依赖于进程的当前工作目录。这可能会导致安全性问题,特别是在多线程环境下,因为当前工作目录是共享的。 openat函数提供了更安全的方式,可以避免依赖于进程的当前工作目录,而是通过提供目录文件描述符来指定相对路径。

2.关闭文件

2.1 函数原型介绍

2.1.1 close函数

#include <unistd.h>

int close(int fd);

函数简介:close函数的作用是关闭文件描述符并释放相关资源。

函数参数:

fd:表示需要关闭的文件描述符。

函数返回值:

成功:返回0.

失败:返回-1,并设置errno,一些常见的错误码包括:

  • EBADF:无效的文件描述符,即文件描述符未打开或已经关闭。
  • EINTR:操作被信号中断。
  • EIO:I/O错误。

2.2 内核源码实现

图 2-1 close函数内核源码分析

 close函数通过系统调用sys_close函数进入内核空间,close通过fd找到struct file对象并清除和释放该对象,struct file的f_op成员会根据文件系统和文件类型不一样而设置不同的值,关闭文件时,也会调用f_op对应的一些具体函数清除资源,典型的情况如socket关闭,socket关闭需要完成三次握手,需要通过f_op->release函数实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DC系列07】DC-7靶机复盘

【DC系列07】DC-7靶机复盘 这个靶机同样是直接给ip的 这个靶机在进入shell前是没有破绽的&#xff0c;并且进入主页面以后也并没有什么漏洞。如果不搜索一下这个靶机的解法很难去下一步操作。 在github.com上搜索dc7user然后选择code&#xff0c;里面可以找到dc7一个远程登陆…

WPS/Office Excel 方向键无法切换表格

问题&#xff1a;WPS/Office Excel 方向键无法切换表格。 分析&#xff1a;键盘开启了Scroll Lock&#xff0c;导致Excel开启了滚动锁定。滚动锁定如图: 解决&#xff1a;再次按下Scroll Lock键解锁即可。&#xff08;Scroll Lock键在键盘右侧上方。&#xff09;

CSS实现底部弧度效果

效果图如下 说明&#xff1a; 使用伪类处理&#xff0c;先将元素自身定位为relative; 伪类设置content:‘’&#xff0c;并相对定位为absolute&#xff0c;通过设置left ,top 值&#xff0c;改变width和和left来调节弧度。宽度需大于100%&#xff0c;将left设为&#xff08;100…

AWS 中文入门开发教学 48- S3 - 静态网站之王, 快速建立网站之首选

知识点 使用 S3 快速搭建静态网页网站使用 Route 53 服务解析网站域名实战演习 设计域名 Name: blog.deeplearnaws.ml建立同名的 S3 存储桶 上传网页文件到存储桶当中 ACL设置为所有人可读 设置存储桶为静态网站公开 进入属性,

索引相关操作

1、建立一个utf8编码的数据库test1 create database test1;2、建立商品表goods和栏目表category 按如下表结构创建表&#xff1a;存储引擎engine myisam 字符集charset utf8 mysql> desc goods;-------------------------------------------------------------| Field …

【试用科研好物】GPT辅助科研神器?AI助力科研?ChatPDF、有道速读

前言 近期需要阅读的论文很多&#xff0c;偶然间在微博刷到许多人推荐科研利器ChatPDF和有道速读。使用后的结论是不推荐使用&#xff0c;下面分别给出理由。 使用&评价 网页版&#xff0c;无需安装任何东西&#xff0c;两款都支持中文。 ChatPDF有道速读 下面太长不看…

vue项目优化问题

文章目录 1、常见的系统优化方案2、非常见的优化手段(但同样是很有用的)1、组件懒加载2、组件代码分割3、函数编译4、组件通讯 1、常见的系统优化方案 图片懒加载、图片压缩、路由组件按需加载(异步加载)、减少console、if判断、cdn加速、axios统一管理请求、v-if与v-show依据…

面试算法题—编程题2023

面试算法题—编程题2023 一、冒泡排序二、选择排序三、快速排序四、其它排序 最近在看一些面试题&#xff0c;发现很多面试过程中都会要求手写排序编程题&#xff0c;经过一番查找整理&#xff0c;可以快速学习和使用相关排序算法题&#xff0c;通俗易懂&#xff0c;手撕代码吊…

6月城市之星领跑活动获奖名单已出炉

经过一个月的角逐&#xff0c;6月城市之星领跑活动上榜名单终于出炉啦&#xff0c;本次城市赛道是根据最后登陆且6月份有入围博客之星用户的城市一共368个城市&#xff0c;城市人数划分区间具体情况如下&#xff1a; 200以上城市2个&#xff0c;其中有一些博主的城市由于未获取…

小程序测试笔记——你想知道的知识全都有

目录 1、你知道测试小程序跟普通的APP有什么异同么&#xff1f; 原生APP 小程序 2、你真真切切的了解什么是小程序么&#xff1f; 3、然后给你一个小程序&#xff0c;你要如何开展测试呢&#xff1f; 一、为什么要学习小程序测试? 二、微信小程序是什么? 概念&#xf…

FTP挂载网络磁盘

项目中使用存储阵列或NAS等网络存储作为文件存储地址&#xff0c;服务器与存储之间通过网络进行传输&#xff0c;当我把ftp指向的存储地址修改为网络磁盘时&#xff0c;会出现550等读取不到目录问题&#xff1b;以下为解决方案&#xff1a; 1.在服务器中新增windows用户&#x…

Vue3+Vite+Pinia+Naive后台管理系统搭建之五:Pinia 状态管理

前言 如果对 vue3 的语法不熟悉的&#xff0c;可以移步Vue3.0 基础入门&#xff0c;快速入门。 Pinia 详情可移步官网参看&#xff1a;Pinia 官网 1. 安装依赖 yarn add pinia // or npm install pinia 2. 构建 src/store/user.js // src/store/user.js import { defineSt…

fiddler在软件测试中的使用(详细版)

目录 1.抓包&#xff0c;辅助定位bug&#xff08;web中类似谷歌浏览器F12开发调试工具&#xff09; 1.1APP抓包分析 2.构建需要的测试场景&#xff08;通过拦截篡改接口的请求或返回&#xff09; 2.1断点篡改请求参数 2.1.1如果需要篡改请求参数&#xff0c;则需要在请求前…

IO流、IO模型

一、IO流分类 1.按照流的方向&#xff1a;输出流和输入流 2.按照流的角色&#xff1a;节点流和处理流 3.按照操作单元&#xff1a;字节流和字符流 二、基类 1.字节输入流和输出流&#xff1a; InputStream、OutputStream 2.字符输入流和输出流&#xff1a;Reader、Writer 三、为…

连锁门店运营管理系统有哪些?应该如何选择?

连锁门店运营管理过程中会面临很多难点&#xff0c;比如不同门店之间很难做到统一管理、销售数据无法实时同步、库存调拨效率低&#xff0c;很容易出现库存不足或过剩的情况... 选择一套合适的连锁门店管理系统&#xff0c;连锁店可以实时获得各个门店的销售、库存和其他关键数…

安达发|APS项目对企业有哪些要求?

尽管APS技术存在相当多的优点&#xff0c;但可以为企业带来其他IT技术以往所不及的收益和管理助力&#xff1b;但这是以APS项目成功部署并发挥作用为前提的。由于APS项目的特性要求较高&#xff0c;目前能够将APS技术运用于运筹和生产活动的企业还非常少。原因有很多&#xff0…

【CNN记录】pytorch中BatchNorm2d

torch.nn.BatchNorm2d(num_features, eps1e-05, momentum0.1, affineTrue, track_running_statsTrue, deviceNone, dtypeNone) 功能&#xff1a;对输入的四维数组进行批量标准化处理&#xff08;归一化&#xff09; 计算公式如下&#xff1a; 对于所有的batch中样本的同一个ch…

贯穿AI生命周期各阶段的道德问题:数据标注部分

随着AI在市场上得到更广泛的采用并被作为各种用例中的工具实现&#xff0c;更多的挑战也应势而生。AI项目遇到了一个长期的关键问题&#xff0c;即合乎道德的AI以及数据中的偏见处理。在AI发展初期&#xff0c;这个问题并不明显。 数据偏见是指数据集中某个元素的代表权重过大或…

Sui开发者网络、测试网和主网的异同之处

Sui在主网正式上线前&#xff0c;发布了两波测试网以及独立的开发者网络供开发者和项目方进行测试。主网与这些网络在部分功能和参数方面有些许不同&#xff0c;本文盘点了这三个网络在功能和参数方面的异同。查看网络信息及更新计划 验证节点集 Sui网络由一组独立的验证节点…

apk反编译检测代码是否混淆

把 apk 当成 zip 并解压&#xff0c;得到 classes.dex 文件&#xff08;有时可能不止一个 dex 文件&#xff0c;但文 件名大多类似&#xff09; 使用 dex2jar 执行如下命令&#xff1a; dex2jar.bat classes.dex 文件路径 得到 classes.dex.jar 然后使用 jd-gui 打开 jar 文件&…