【Linux】浅谈文件原理与操作

这篇具有很好参考价值的文章主要介绍了【Linux】浅谈文件原理与操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

问题引入

浅谈文件原理

文件操作

文件的打开与关闭

open

close

write与read

再谈C库文件操作


问题引入

🌸以前我们学过C语言的文件操作,而不同语言的文件操作都是不一样的,我们该如何理解这一现象,能不能用一种统一的视角看待所有文件操作?今天就一起来谈谈文件操作。


浅谈文件原理

我们都知道,文件 = 内容 + 属性,对于一个文件的操作可以看成对内容或属性的操作

通过冯诺依曼体系我们知道当我们对文件进行操作时,该文件一定处于内存之中,而未被进行操作的文件则位于磁盘里。

在操作系统看来,文件便可以被分成两大类:磁盘文件被打开文件

🌸其中被打开文件至少需要将文件属性加载到内存之中,而每次文件操作前我们都要先打开文件的本质就是:将目标文件属性加载到内存中。因此,OS内部一定会同时存在大量的被打开的文件。需要将其以先描述再组织的方式管理起来

这样在OS内部对于打开文件的管理就转换成了对链表的增删查改。即文件被打开前,OS要为被打开文件创建内核数据结构 struct file

🌸那么文件是被谁打开的呢?

  • 用户通过调用进程完成打开文件的操作

如此解释后,我们对于文件又有进一步的认识,下面我们来介绍一下在OS层面文件操作的系统接口。

文件操作

🌸对C语言文件操作不熟悉或有些忘记了的,也可以看看这篇复习一下:C语言文件操作的基础应用。

文件的打开与关闭

open

🌸通过手册查询,我们可以找到 open 函数的相关信息,其中的参数分别是文件路径打开文件的选项

【Linux】浅谈文件原理与操作

🌸其中的 flag ,我们不能将其看成一个整数而是将其看作一个位图

【Linux】浅谈文件原理与操作

🌸其中每一个位置都代表一个选项,为 1 则表示选中反之不选,库中定义了宏方便我们直接使用。

  • O_WRONLY  只写选项
  • O_RDONLY   只读选项
  • O_APPEND   追加写入
  • O_TRUNC     打开时清空文件
  • O_CREAT      若文件不存在则创建
  • O_RDWR       支持同时读写

🌸在使用时使用 | 操作符标记位图的对应位置即可。

int main()
{
    open("log.txt", O_WRONLY | O_TRUNC | O_CREAT);  //以只读每次打开清空文件若不存在则创建新文件的方式打开
    return 0;
}

🌸这时候,我们便会发现现在的这个操作跟 fopen 十分的相似,只不过将 w 选项拆成了三个选项。其实,fopen 的底层便是调用了这个系统调用进行文件的打开操作。

🌸虽然我们成功创建出一个文件了,但此时我们可以看到,该文件的权限却是乱码,因此在创建文件时我们就需要手动设置文件的权限。

【Linux】浅谈文件原理与操作

🌸open 还重载了三个参数的版本,供我们设置文件权限

int main()
{
    open("log.txt", O_WRONLY | O_TRUNC | O_CREAT,0666);
    return 0;
}

 【Linux】浅谈文件原理与操作

🌸这下创建出来的就是正常权限的文件了,但是却与我们设置的 0666 不一样而是 0664 呢?这是由于文件的权限还受到权限掩码的影响,因此需要将 umask 置零。

int main()
{
    umask(0);
    open("log.txt", O_WRONLY | O_TRUNC | O_CREAT,0666);
    return 0;
}

🌸这下就根据我们要求创建出对应权限的文件了。

🌸而  open 有一个返回值,我们刚才忽略掉了,其为文件描述符又名 fd,我们需要定义一个变量接收一下它,之后需要用它定位文件。

🌸若 fd 为 -1 说明打开文件失败,我们可以在打开文件后增加一个判断。

int main()
{
    umask(0);
    int fd = open("log.txt", O_WRONLY | O_TRUNC | O_CREAT,0666);
    if(fd == -1)
    {
        printf("fd: %d,errstring is: %s\n",fd,strerror(errno));
    }
    return 0;
}

close

【Linux】浅谈文件原理与操作

🌸关闭文件就需要我们上面存起来的 fd 了,直接传入 fd 即可关闭文件。

int main()
{
    umask(0);
    int fd = open("log.txt", O_WRONLY | O_TRUNC | O_CREAT,0666);
    if(fd == -1)
    {
        printf("fd: %d,errstring is: %s\n",fd,strerror(errno));
    }
    close(fd);
    return 0;
}

write与read

🌸打开文件后我们就可以根据需求对文件进行读写了,先介绍 write 接口。

🌸参数分别是 fd写入内容的字符串写入的字节数,写入后返回写入的字节数,失败则返回 -1。

【Linux】浅谈文件原理与操作

🌸这里我先将用 snprintf 内容格式化写入一个字符串中,再写到文件里。

int main()
{
    umask(0);
    int fd = open("log.txt", O_WRONLY | O_TRUNC | O_CREAT,0666);
    if(fd == -1)
    {
        printf("fd: %d,errstring is: %s\n",fd,strerror(errno));
    }
    const char* ptr = "helloworld";       //原字符串
    char str[20];                         //转接的字符数组
    int i = 1;
    snprintf(str,sizeof(str),"%s: %d",ptr,i);   //加个序号格式化写入
    write(fd,str,strlen(str));                  //写入文件
    close(fd);                                  //关闭文件
    return 0;
}

[注意]:\0 是C语言库中的设定,直接写入到文件中会被识别成乱码,使用 write 写入时要注意不写入 \0。因此写入时直接使用 strlen 便可以自动规避掉 \0。

🌸之后我们来看读取的操作,需要传入 fd 定位文件,之后将文件内的数据读入数组中,读取 count 个字节。

🌸成功读取后会返回读取的字节数,若读取失败则会返回 -1。

【Linux】浅谈文件原理与操作

🌸这次我们以读取的方式打开文件,由于不用创建文件因此就不需要手动设置文件权限了。

int main()
{
    int fd = open("log.txt", O_RDONLY);     //只读打开文件
    char buffer[1024];
    size_t n = read(fd, buffer, sizeof(buffer) - 1);   //为\0留一个位置
    if (n > 0)      //说明读入数据
    {
        buffer[n] = '\0';            //在数据尾部插入\0
        printf("%s\n", buffer);      //打印出数据内容
    }
    return 0;
}

🌸同时为了方便接下来的读写,读取需要为 \0 预留一个位置,之后再加上即可。

再谈C库文件操作

🌸在上面我们就说过C库文件操作的底层本质上也是调用了操作系统提供的系统调用,即库函数只是对系统调用的封装

🌸那又是为什么呢?我们可以用下面这张图简单理清几者之间的关系。

【Linux】浅谈文件原理与操作

🌸只要涉及文件操作,就与文件读写分不开关系,在读写的过程中便会涉及到对硬件的访问,而硬件是由操作系统进行管理的。因此从用户层面出发,只要访问到硬件就无法绕开操作系统。

🌸不仅只是C语言,任何语言的文件操作都是对系统调用的封装,都是借助系统接口才能够实现!!!


🌸好了,今天 浅谈文件原理与操作 的相关内容到这里就结束了,如果这篇文章对你有用的话还请留下你的三连加关注。文章来源地址https://www.toymoban.com/news/detail-479900.html

到了这里,关于【Linux】浅谈文件原理与操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 操作系统原理 —— 文件的逻辑结构(二十三)

    这里说的 逻辑结构 ,就是指在用户看来,文件内部的数据应该是如何组织起来的,而 物理结构 指的是在操作系统看来,文件的数据是如何被存放的。 从 逻辑结构 结构来看,我们可以打开一个记事本,里面的文字内容从用户的角度来看就是无结构的,但是又从 Excel 来看,

    2024年02月08日
    浏览(62)
  • Linux 操作系统原理 — PCIe 总线标准

    2023年04月24日
    浏览(82)
  • 【Linux】Linux的文件操作

    文件操作对于不少编程初学者来说都是一件头疼的事情,不管你学习的是什么编程语言,C/C++/Java/Go/Python ,因为我们学习到的文件相关的操作对你来说都是一个黑盒,我们只是知道我们应该怎么使用相应的文件函数进行操作,而对于内部的实现方式的一无所知,这导致很多初学

    2024年02月05日
    浏览(41)
  • Linux 命令操作(一)——文件和目录操作

    目录信息 参考链接 Linux常用操作命令大全 1.1、创建文件夹 1.1.1、创建目录 1.1.2、创建文件 touch命令操作 1.2、删除文件夹/文件 1.2.1、删除目录操作 1.2.2、删除文件 1.3、重命名目录或者文件名称 1.4、目录切换 1.5、目录以及文件列表查看 1.6、复制目录或者文件 -r 递归处理,将

    2024年02月03日
    浏览(46)
  • 【Linux】Linux文件IO常规操作

    Linux 文件 IO 操作指的是在 Linux 系统上对文件进行读取和写入的操作。它是通过与文件系统交互来读取和写入文件中的数据。 在 Linux 中,文件被视为一系列字节的有序集合,每个文件都有一个相关联的文件描述符,用于标识该文件的唯一标识符。文件 IO 操作允许程序从文件

    2024年02月05日
    浏览(72)
  • 浅谈端口扫描原理

    端口扫描,顾名思义,就是逐个对一段端口或指定的端口进行扫描。通过扫描结果可以知道一台计算机上都提供了哪些服务,然后就可以通过所提供的这些服务的己知漏洞就可进行攻击。其原理是当一个主机向远端一个服务器的某一个端口提出建立一个连接的请求,如果对方

    2024年04月24日
    浏览(34)
  • 浅谈Docker原理

    Docker 是一种容器化技术,它通过利用 Linux 内核提供的虚拟化技术和隔离机制,实现了更轻量级的应用程序虚拟化方案 Docker 使用了 Linux 的命名空间特性,包括 mount、PID、network 等,这些命名空间将不同的资源隔离开来,使得容器内的进程看起来像在独立的环境中运行,从而降

    2024年02月08日
    浏览(41)
  • 浅谈比特币原理

    比特币是什么? 1. 2008年11月1日,中本聪《白皮书》,去中心化的记账系统 中心化的记账系统 1. 什么是记账?比如你去楼下的711买了一瓶肥宅快乐水,用支付宝付了3块钱,支付宝会检查账户有没有这么多钱,支付了之后还剩多少钱等等。现在的记账都是银行来记,因为银行

    2024年02月10日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包