个人主页: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
本节我们使用了不少fd,但是没有解释什么是fd,我们下节将会引入fd,以及分析系统接口的细节,我们下节见!