
fopen以"w"方式打开:如果文件不存在,先会创建一个文件 / 如果文件存在,先会清空文件内容,然后再从头进行写入操作。


这上面的操作是不是和输入重定向很相似。


fopen以"a"方式打开:本质也是写入,如果文件不存在,先会创建一个文件,然后进行写入 / 如果文件存在,会在文件原有内容的末尾处追加写入。

上面的操作是不是和追加重定向很像。

当文件不存在的时候,在当前路径下创建一个,那么进程又是如何知道当前文件的呢?--- 当然是记录在进程PCB当中的。
可以 ls /proc/pid 查看
补充函数:
int chdir(const char* path);


三大标准输入,OS都默认帮你打开了。
一、标准输入流stdin
二、标准输出流stdout
三、标准错误输出流stderr
访问文件不仅有C语言上的文件接口,OS必须提供对应的访问文件的系统调用接口。即:C标准库中的文件IO接口,底层一定封装了系统调用接口。

fopen:"r"-> open:O_RDONLY
fopen:"w"-> open:O_WRONLY|O_CREAT|O_TRUNC
fopen:"a"-> open:O_WRONLY|O_CREAT|O_APPENDO_WRONLY O_CREAT O_APPEND 这三个大写的字符串,还是这种格式的,我们很容易就联想到宏。
//宏
#define O_RDONLY 0x00000000 // 只读模式 16进制
#define O_WRONLY 0x00000001 // 只写模式
#define O_RDWR 0x00000002 // 读写模式
//以上三个常量,必须且只能指定一个
#define O_CREAT 0x00000100 // 如果文件不存在,则创建文件
#define O_TRUNC 0x00000200 // 如果文件存在,则截断为零长度
#define O_APPEND 0x00000400 // 每次写入时追加到文件末尾
#define O_EXCL 0x00000800 // 如果文件已存在,则打开失败
#define O_NONBLOCK 0x00001000 // 非阻塞模式 

文件不存在的时候,要创建文件时,要用mode参数设置权限, 如果没有设置权限就会出现下面的情况(权限乱码)


现在让我们来看看mode参数如何传参。


为什么我们用mode设置的文件权限是666,但是文件权限最终确实664呢? (这是因为权限掩码的存在) 原因:默认(最终)权限计算公式 = 起始权限 & (~umask值) , 本质是从起始权限中去掉在umask权限中出现的权限,如果在起始权限中某权限位不存在,但umask中该权限位存在,该权限位的结果为0,"去掉"不是删除。

umask函数只会影响调用它的进程所创建的权限掩码,而不会对父进程或其他进程的权限掩码产生影响。




