前言:本章我们介绍 O_WRONLY, O_TRUNC, O_APPEND 和 O_RDONLY。之后我们开始讲解文件描述符。
一、系统传递标记位
1、O_WRONLY
C 语言在 w 模式打开文件时,文件内容是会被清空的,但是 O_WRONLY 好像并非如此?
代码演示:当前我们的 log.txt 内有 5 行数据,现在我们执行下面的代码:
1 #include <stdio.h>
2 #include<string.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <fcntl.h>
6 #include <unistd.h> // 需引入头文件
7 int main()
8 {
9 umask(0); // umask现在就为0,听我的,别听操作系统的umask了
10 int fd = open("log.txt", O_WRONLY | O_CREAT, 0666); // 八进制表示
11 if (fd < 0) {
12 perror("open");
13 return 1;
14 }
15 printf("fd:%d\n",fd);
16 int cnt=2;
17 const char* str="666666\n";
18 while(cnt--){
19 write(fd,str,strlen(str));
20 }
21
22 close(fd);//关闭文件
23
24 return 0;
25 }
运行结果:
我们以前在 C 语言中,w 会覆盖把全部数据覆盖,每次执行代码可都是会清空文件内容的。
而我们的 O_WRONLY 似乎没有全部覆盖,曾经的数据被保留了下来,并没有清空!
其实,没有清空根本就不是读写的问题,而是取决于有没有加 O_TRUNC 选项!
因此,只有 O_WRONLY 和 O_CREAT 选项是不够的:
- 如果想要达到 w 的效果还需要增添 O_TRUNC
- 如果想到达到 a 的效果还需要 O_APPEND
2、 O_TRUNC 截断清空(对标 w)
在我们打开文件时,如果带上 O_TRUNC 选项,那么它将会清空原始文件。
如果文件存在,并且打开是为了写入,O_TRUNC 会将该文件长度缩短 (truncated) 为 0。
也就是所谓的 截断清空 (Truncate Empty) ,我们默认情况下文件系统调用接口不会清空文件的,
但如果你想清空,就需要给 open() 接口 带上 O_TRUNC 选项:
代码演示:让 open() 达到 fopen 中 "w" 模式的效果
1 #include <stdio.h>
2 #include<string.h>