Linux6.2、IO基础(文件系统接口)

发布时间:2023年12月25日

个人主页:Lei宝啊?

愿所有美好如期而遇


直接使用系统接口

fopen底层封装的系统接口为open

pathname也就是文件路径,flags我们通过一个demo来理解。

首先我们应该了解的是位图,int有32个比特位,我们根据他的比特位是否为1来决定这个位我们是否使用,而我们的flags就是应用了位图来代表打开文件的方式,C库函数我们使用r,w,a等方式打开文件,而系统接口就没这么简单了,我们看下图:

O_RDONLY表示只读,O_WRONLY表示只写,O_RDWR表示读写,而且这三个我们必须包含一个,O_APPEND表示追加,O_CREAT表示创建,O_TRUNC表示清空文件。

我们发现他们都是大写的,这也就代表他们是个宏,我们来尝试看一下:

接下来我们来看demo:

所以我们的flags该怎么用呢?

我们先删除log.txt文件,我们希望以w方式打开文件,如果不存在则创建。

同时我们了解一下fclose的底层,方便我们演示后关闭文件,close参数就是open的返回值,这里先说这么多,后面细说。

我们的文件呢?我们不是以写的方式打开的吗?库函数做一步的工作,系统函数一步可完成不了,O_CREAT创建选项是不是没加呢?我们加上

我们创建出了文件,但是他的权限好像和我们touch出来的不一样,而且还标红了,所以我们还是少了东西,少了什么呢?

我们这个时候就需要使用带mode参数的open函数了,他代表着权限,我们传八进制。

0666,写成二进制就是110110110对应着rw-rw-rw-但是我们发现最后other所属组权限没有写,这就是因为umask掩码。

我们可以在函数里设置当前进程所要设定的掩码,不会影响到整个bash。

我们创建文件时需要路径,绝对路径或者相对路径,我们要在当前路径下创建文件,那么系统怎么知道当前路径是什么?根据可执行程序路径?源代码路径?或者是进程路径?我们来测试一下:

cwd指向的也就是我们进程的当前工作路径,exe指向我们可执行程序的路径,我们也就知道了创建文件当前路径的位置也就是进程所在路径。

综上所述我们也就可以体会到为什么要使用库函数的原因之一,就是因为难度,初学者使用系统调用的难度确实很高,让你初学C语言时包含一堆看不懂的头文件,以及学习位图的理解,涉及到系统的知识,会不会直接劝退~。

当然,我们的w打开文件方式还没有复现完全,缺少O_TRUNC清空,但是现在,这很简单不是吗?包括追加,相信也不是什么难事,所以不做演示。

fwrite底层封装的系统接口为write?

fread底层封装的系统接口为read

?fclose底层封装的系统接口为close

实现cat??

本节我们使用了不少fd,但是没有解释什么是fd,我们下节将会引入fd,以及分析系统接口的细节,我们下节见!

文章来源:https://blog.csdn.net/m0_74824254/article/details/135134848
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。