open函数常用的flags

在上一个博客中我也提到了O_RDWR、O_RDONLY、O_WRONLY这三个flag,还有一些也是比较常用的flag,这里总结一下

  • O_TRUNC

O_TRUNC
If the file already exists and is a regular file and the access
mode allows writing (i.e., is O_RDWR or O_WRONLY) it will be
truncated to length 0. If the file is a FIFO or terminal
device file, the O_TRUNC flag is ignored. Otherwise, the
effect of O_TRUNC is unspecified.

前提条件是这个文件要存在而且必须可写,然后如果加上了O_TRUNC这个flag的话,则里面的内容都会被删掉,be truncated -被删节
ps.用法的话一般都是O_WRONLY|O_TRUNC这样通过或运算结合一起组成一个新的flag进行使用。

  • O_APPEND

The file is opened in append mode. Before each write(2), the file
offset is positioned at the end of the file, as if with lseek(2).
The modification of the file offset and the write operation are
performed as a single atomic step.

我看得懂的地方大概就是说用了这个flag之后,进去的时候偏移量的位置会移动到最末端,然后如果后面添加的时候就不会覆盖前面位置的值。
append嘛,附加的意思。

  • O_NONBLOCK
    这个flag用来设置函数为非阻塞形式,打开文件的时候默认是阻塞式的,一般非阻塞式在设备文件(LCD、I2C、串口)这些地方用,不用于普通文件
  • O_SYNC
    引用课堂笔记,因为这个我也没能很好表达出来。

(1)write阻塞等待底层完成写入才返回到应用层。
(2)无O_SYNC时write只是将内容写入底层缓冲区即可返回,然后底层(操作系统中负责实现open、write这些操作的那些代码,也包含OS中读写硬盘等底层硬件的代码)在合适的时候会将buf中的内容一次性的同步到硬盘中。这种设计是为了提升硬件操作的性能和销量,提升硬件寿命;但是有时候我们希望硬件不好等待,直接将我们的内容写入硬盘中,这时候就可以用O_SYNC标志。

  • O_CREAT

If pathname does not exist, create it as a regular file.

这里引用一小节,就是说如果文件不存在的话可以用这个flag去open文件顺便创建出来,就像在linux的terminal下面touch一个不存在的文件,也不会报错,而是顺便帮你新建一个。
当然只是这样用的话可能会出错,如果不小心create了一个文件跟原有的文件重名的话就会损坏源文件了,所以这里的O_CREAT一般与O_EXCL用或运算一起用

O_EXCL
Ensure that this call creates the file: if this flag is
specified in conjunction with O_CREAT, and pathname already exists,
then open() fails with the error EEXIST.

补充知识
一、之前用的open、read、write,如果出现了失败的话就要结束程序。
可以用到的方法有
1.用return,一般默认return-1表示错误,return 0 表示正常。
2.可以用exit、_exit、_Exit

#include <unistd.h
void _exit(int status);
#include <stdlib.h>
void _Exit(int status);

这里用_exit和_Exit来举例子,引用man手册里面的讲述,记得用的时候也要像return 那样机上标志位-1/0就行

二、之前也有提及到查man手册open的摘要里面有提到了mode模式位置的设置,用来设置可读可写可执行的权限。
这里涉及到了linux下的文件权限问题了,具体可以看这个链接
https://www.cnblogs.com/songgj/p/8890710.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值