目录
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,为什么中间有个|,也就是按位或操作?
首先回答第一个问题,敏感的同学可能已经发现了,这些都是大写字母,不难猜出它们是宏,被定义成了整数。
第二个问题,我现在编写一个标志位传参的函数来解释:
运行一下看看:
你可以自己模拟一下这个代码的运行流程,它巧妙地运用了位图和位操作,通过传递一个参数实现多种功能。
虚拟文件系统:回到open函数,可以注意到之前的代码,open函数有一个返回值,这个返回值是文件的文件标识符。一个进程可能会打开多个文件,当一个文件被打开时,会创建一个struct file来描述这个文件。当一个进程被创建时,会生成一个task_struct结构体,这个结构体中会存放一个指针struct files_struct* files,这个指针指向一个数组,这个数组存放了所有被打开文件的struct file的指针。open的返回值就是该文件的struct file在该数组中的下标,也称为文件描述符。上述内容可以理解为下图:
struct file中存储了文件的内核级缓冲区和操作底层方法的指针表,用来对磁盘中的文件进行修改。
这套文件系统被称为虚拟文件系统。
因此,我们的操作系统在对文件进行操作时,只认文件描述符fd!!!
write:
这里传fd的作用,想必不需要我多讲了,这个函数的功能应该很明显了。
close:
这个更简单了,只需传递需要关闭的文件的文件描述符即可。
现在我们将最开始的C语言文件操作代码,改成使用系统调用的形式:
跨平台性:那么问题来了,Linux系统中已经有了系统调用的文件操作,为什么C语言还要提供fwrite、fopen等文件操作函数呢?直接使用Linux中的系统调用不好吗?
主要是为了提高代码的可移植性和跨平台性。在Linux中,系统调用是open,但在Windows中,系统调用可能不同。因此,C语言不得不这样做。而且,C语言的fopen等函数内部肯定封装了Linux系统调用的open和文件描述符,因为Linux只认文件描述符。
以上就是linux文件系统的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号