linux文件系统

目录

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只认文件描述符。

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咬_咬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值