fcntl函数
2020-10-11 本文已影响0人
李伟13
#include <fcntl.h>
int fcntl(int fd, int cmd, ...);
其中,fd是文件描述符,cmd表示执行何种操作,依据操作类型不同,可能需要第三个可选参数arg
文件描述符标志/文件状态标志
https://blog.csdn.net/kyang_823/article/details/79496362
文件状态标志分类
1、访问方式标志
指明允许文件标志符用于读、写或两者兼之,包括O_RDONLY、O_WRONLY和O_RDWR。
这些访问方式在文件被打开时选定,之后便不能再改变。
可以通过fcntl函数获取文件访问方式。——因为读和写访问方式不是各占一位,因此获取文件访问方式的可移植方法是用屏蔽字O_ACCMODE先与文件状态标志值作按位与操作(’&’)得到访问方式位,再将结果与这3个值逐一比较(APUE set_fl函数)。
2、打开时标志
指明打开文件时影响open行为的一些选项。
- 这些选项除了O_NONBLOCK其他的一旦文件打开就不再保留,因为O_NONBLOCK同时也是一个I/O操作方式,故此标志被保留。
- O_CREAT:若设置,当该文件不存在时创建并打开此文件。
- O_EXCL:若O_CREAT和O_EXCL同时设置,当指定的文件已经存在时open失败。保证不破坏已存在的文件。
- O_TRUNC:截断文件为零长度,这一选项只对普通文件有用,对诸如目录或FIFO之类的特殊文件无用。
- O_NONBLOCK:防止为打开文件而阻塞很长时间。这通常仅对设备、网络、管道文件才有意义。此标志同时也作为I/O操作方式标志,这意味着在open中指明O_NONBLOCK就同时设置了非阻塞I/O方式。因此要非阻塞地打开一个文件且不影响正常的阻塞I/O,必须先设置O_NONBLOCK调用open,然后调用fcntl关闭此位。
3、I/O操作方式标志
使用fd读/写的工作方式。这些标志由open()设置,之后可以用fcntl()获取和改变。
- O_APPEND:用于追加写。若此位设置,所有write()操作写数据至文件尾而不管文件位置在何处。这是附加数据至文件尾唯一可靠的方法。用附加方式可以保证无论是否有其他进程正在写同一个文件,write()操作总是将数据写在当前文件尾。相反,在未设置此位的情况下,如果通过简单地移动文件位置到文件尾,然后再写数据,则在设置文件位置之后开始写之前,可能有其他进程扩展此文件(对应于两个不同的进程打开同一个文件的情形,它们共享同一个vnode,但各自有自己的系统打开文件表,因而有自己的文件位置),从而导致所写的数据出现在实际文件尾之前的某个地方。
- O_NONBLOCK:用于非阻塞I/O。
- O_ASYNC:用于信号驱动的I/O(异步I/O)。若此位设置,当文件标志符中有输入数据时会生成SIGIO信号。
- O_SYNC:用于同步I/O。若此位设置,文件按同步I/O方式打开,并将导致任何写该文件的操作都阻塞调用进程直至内核I/O缓冲区的数据以及与此次写有关的文件属性已全部写至物理存储介质。
- O_DSYNC:用于同步数据I/O。若此位设置,文件按同步I/O方式打开,并将导致任何写该文件的操作都阻塞调用进程直至内核I/O缓冲区的数据已全部写至物理存储介质。但如果所写的数据不影响读刚写入的数据,则不等待文件属性更新。
- O_RSYNC:若此位设置,文件按同步I/O方式打开,并将导致任何读该文件的操作都将等待所有写入同一区域的写操作按O_DSYNC和O_SYNC完成后再进行。如果同时设置了O_SYNC 和 O_RSYNC标志,则读操作将阻塞直到文件的访问时间属性已写至物理存储介质。如果同时设置了O_DSYNC 和 O_RSYNC标志,则读操作将阻塞直到所有与保持文件完整性有关的数据都已写至物理存储介质。
简单地说,O_SYNC、O_DSYNC和O_RSYNC这几个标志的主要作用是使数据直接写到磁盘或直接从磁盘读入。