前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux文件系统

linux文件系统

作者头像
咬咬
发布2024-06-12 14:02:58
820
发布2024-06-12 14:02:58
举报
文章被收录于专栏:学习笔记学习笔记

目录

c语言文件操作:

linux文件系统调用:

open:

标志位传参:

虚拟文件系统:

write:

close:

跨平台性:


c语言文件操作:

先来简单回顾一下c语言的文件操作,fopen,fread,fwrite,fclose等,我们在linux下简单编写代码实践一下:

关于这几个函数的用法,可以参考www.cplusplus.com这个网站,这里不再过多赘述。我们运行看看:

理解文件:

我们在编写程序的时候,并没有对文件进行修改,打开和关闭,而是在生成可执行文件后,我们在运行可执行文件时,文件才会被打开,修改,关闭。

linux文件系统调用:

在linux中,我们还可以使用系统调用来对文件进行修改,我们来认识几个系统调用接口:

open:

我们先在linux下查一下这个函数的系统调用手册:

咱们先重点介绍一下标志位传参:

标志位传参:

先说说它的作用: 借助位图,通过一个参数位置,达到传入多个选项,实现不同的功能。在c语言的fopen中,我们可以把文件以读,写,追加等方式打开,这些就是选项,那这个open函数如何传选项呢,没错就是通过这个标识位:

现在你肯定有两个问题:

1,open手册里,标识位明明要传的int,为什么传了O_WRONLY|O_CREAT这一串东西。

2,为什么中间有个|,也就是按位或操作。

首先第一个问题,敏感的同学可能发现了,都是大写,不难猜出,它们是宏,它们肯定事先被define成了整形 。

第二个问题,我现在自己写一个标志位传参的函数来解释:

运行一下看看:

可以自己模拟一下这个代码的运行流程,巧妙运用了位图,位操作,完成了传一个参数,实现多种功能。

虚拟文件系统:

回到open函数,可以注意到之前的代码,open函数有一个返回值,这个返回值是这个文件的文件标识符,一个进程,可能会打开很多文件,当一个文件被打开会创建一个struct files来描述这个文件,当一个进程被创建,就会生成一个task_struct的结构体,这个结构体里会存放一个指针struct files_struct* files,这个指针指向了一片数组,这个数组存放了所有被打开文件的struct files的指针,open的返回值就是该文件的struct files在该数组的下标,又称文件描述符,上述可以理解成下图:

struct file中存又文件内核级缓冲区和操作底层方法的指针表来对磁盘中的文件进行修改。

这套文件系统被称为虚拟文件系统 。

所以我们的操作系统在对文件进行操作时,只认文件描述符fd!!!

write:

这里传fd的作用,想必不需要我多讲了,这个函数功能应该很明了了。

close:

这个更简单了,只需传需要关闭的文件的文件描述符即可。

现在我们把最开始的c语言的文件操作代码,改成系统调用的:

跨平台性:

那么问题来,linux系统里已经有系统调用的文件操作了,为什么c语言还要写fwrite,fopen等文件操作,直接用linux里面的不好m吗?

主要是为了提高的代码的可移植性,跨平台性,在linux里的系统调用是open,可能在windows里面的系统调用又不一样,所以c语言不得不这么做,而且c语言的fopen等函数里面一定封装了linux系统调用的open和文件描述符,因为linux只认文件描述符。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • c语言文件操作:
  • linux文件系统调用:
    • open:
      • 标志位传参:
        • 虚拟文件系统:
          • write:
            • close:
              • 跨平台性:
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档