Linux--文件IO中几点注意的地方

一、open函数

打开存在并有内容的文件时可用选项:O_APPENDO_TRUNC

(1)I0文件指针在文件开头,新内容写在前面,依次覆盖旧的内容:

open("a.txt", O_RDWR);  

(2)文件指针被设置到文件底部,新内容添加在旧内容的后面:

open("a.txt", O_RDWR|O_APPEND);  

(3)文件长度截取为0,新内容写在前面,旧内容被删除:

open("a.txt", O_RDWR|O_TRUNC);   

(4)文件长度截取为0,新内容写在前面,旧内容被删除:

open("a.txt", O_RDWR|O_APPEND|O_TRUNC);  

open函数和fopen函数的区别
在这里插入图片描述

二、lseek的使用

系统函数open加了参数O_APPEND之后,再去调用lseek函数移动文件指针是无效的!添加的文件内容始终在文件末尾。

fd = open("a.txt", O_RDWR|O_APPEND);
ret = lseek(fd, 4, SEEK_SET);

三、O_APPEND解决覆盖问题

多次打开同一个文件,得到了不同的文件描述符,分别对他们进行写操作,这个时候的写操作为分别写,有时候我们希望接续写而不是分别写?办法就是在open时加O_APPEND标志即可进行接续写
O_APPEND的实现原理和其原子操作性说明:
(1)O_APPEND为什么能够将分别写改为接续写?关键的核心的东西是文件指针。分别写的内部原理就是2个fd拥有不同的文件指针,并且彼此只考虑自己的位移。但是O_APPEND标志可以让write和read函数内部多做一件事情,就是移动自己的文件指针的同时也去把别人的文件指针同时移动。(也就是说即使加了O_APPEND,fd1和fd2还是各自拥有一个独立的文件指针,但是这两个文件指针关联起来了,一个动了会通知另一个跟着动)
(2)O_APPEND对文件指针的影响,对文件的读写是原子的。
(3)原子操作的含义是:整个操作一旦开始是不会被打断的,必须直到操作结束其他代码才能得以调度运行,这就叫原子操作。每种操作系统中都有一些机制来实现原子操作,以保证那些需要原子操作的任务可以运行。

四、复制文件描述符

dup()用法

int dup(int oldfd);

系统调用函数dup()会复制旧的文件描述符oldfd,使用最小的没有使用的文件描述符编号,从而返回一个新的文件描述符。在成功的创建之后,新的和旧的文件描述符可能被交替调用,他们指向同一个打开的文件,共享文件指针和状态标志;例如,使用lseek改变一个描述符的文件指针位置,另外一个文件描述符中的指针位置也会同样变化。
在这里插入图片描述

dup2()用法

int dup2(int oldfd, int newfd);

dup2()和dup()不一样的地方是,dup2()可以指定文件描述符的编号为newfd。如果newfd已经打开了,则会先将newfd关闭。如果newfd等于oldfd,则返回newfd,并不会关闭newfd。


参考资料:朱老师嵌入式Linux

猜你喜欢

转载自blog.csdn.net/Meteor_s/article/details/83272600