open、create、lseek、read、write、pread、pwrite、dup、dup2、sync、fsync、fdatasync
open操作
#include<fcntl.h>
int open(const char* pathname,int flags,mode_t mode);
作用:以各种方式打开文件
返回值:返回打开的文件句柄(一般会大于0),-1 打开失败
第三个参数仅当创建新文件时(即 使用了O_CREAT 时)才使用
输入参数说明:
pathname : 文件路径
flags: rwx操作必选,其他为可选操作
mode: 使用了O_CREAT时,rwx初始化权限设置
access和mode的可取值通常在FCNTL.h里面定义,access的可取值如下:
#define O_RDONLY 1
#define O_WRONLY 2
#define O_RDWR 4
access还可以是以下flag及它们之间的组合而得到的性质:
#define O_CREAT 0x0100 /* create and open file */
#define O_TRUNC 0x0200 /* open with truncation */
#define O_EXCL 0x0400 /* exclusive open */
#define O_APPEND 0x0800 /* to end of file */
#define O_CHANGED 0x1000 /* user may read these bits, but */
#define O_DEVICE 0x2000 /* only RTL/io functions may touch. */
#define O_TEXT 0x4000 /* CR-LF translation */
#define O_BINARY 0x8000 /* no translation */
create操作
int create(char* pathname,mode_t mode)
作用:创建一个新文件,若成功则返回文件句柄(一般会大于0),否则返回-1。
参数:pathname为文件名,mode为模式
close
int close(int fd);
作用:关闭文件,若文件顺利关闭则返回0, 发生错误时返回-1.
lseek
off_t lseek(int filde, off_t offset, int whence);
作用:定位文件操作位置,若成功则返回定位位置,否则返回-1。
输入参数说明:
filde :文件描述符
offset:偏移位置,带符号整型数据
whence:定位。SEEK_SET 开头;SEEK_CUR 当前位置;SEEK_END 结尾
read
ssize_t read(int fd, void *buf, size_t count);
作用:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0。
参数说明:fd 文件描述符;buf 存储数据指针;count 需要读取字节数
write
ssize_t write(int fd, const void *buf, size_t nbyte);
作用:成功返回写入的字节数,出错返回-1并设置errno。
参数说明:fd 文件描述符;buf 存储数据指针; nbyte 需要写入字节数
read与write注意事项:一般读写一页时,I/O效率最佳,32位系统一页一般为4096 Byte
pread
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
作用:读取指定位置的内容,成功返回读取的字节数,出错返回-1并设置errno
参数说明:fd 文件描述符;buf 存储数据指针;count 需要读取字节数,offset为偏移量
注意,执行后,文件偏移指针不变
pwrite
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
作用:向指定位置写入内容,成功返回写入的字节数,出错返回-1并设置errno
参数说明:fd 文件描述符;buf 存储数据指针;count 需要写入字节数,offset为偏移量
注意,执行后,文件偏移指针不变
pread与pwrite都是原子操作,不需要考虑临界区问题。
dup与dup2
int dup(int fd);
int dup2(int oldfd,int newfd);
作用:两个均为复制一个现存的文件的描述,若成功为新的文件描述,若出错为-1;
dup返回的新文件描述符一定是当前可用文件描述中的最小数值。
dup2则可以用newfd参数指定新的描述符数值。如果newfd已经打开,则先关闭。
通常使用这两个系统调用来重定向一个打开的文件描述符
sync与fsync,fdatasync
大多数磁盘的I/O操作通过缓冲区进行,写入数据时,先将数据放入缓冲区,然后排入队列,然后等待写入磁盘
int sync(void); 将所有修改过的缓冲区排入队列,然后返回(不会等待写入磁盘)
int fsync(int fd); 将制定文件修改写入磁盘,然后返回
int fdatasync(int fd); 将制定文件修改写入磁盘,然后返回(只更新数据,sync会同步更新文件属性)
ioctrl
与驱动相关的操作,具体的实现在kernel driver完成
文件描述符在/dev/fd/下显示