#include <fcntl.h> int open(const char *path, int oflag, ... /* mode_t mode */ ); int openat(int fd, const char *path, int oflag, ... /* mode_t mode */ );
open函数调用成功返回打开文件的文件描述符,失败时返回-1。oflag参数表明打开文件的状态标志,必须且只能包含以下5个标志中的一个:
O_RDONLY:只读打开
O_WRONLY:只写打开
O_RDWRONLY:读写打开
O_EXEC: 只执行打开
O_SEARCH:只搜索打开,仅用于目录
除了这些标志以外,还有一些标志为可选选项
O_APPEND: 在文件末尾写入,有此选项存在时,文件每次写入都是以文件末尾为基准添加内容,不可以修改已写入的内容
O_CREAT: 文件不存在时,创建文件
O_EXCL:与O_CREAT同时出现时,如果文件已存在,调用出错
O_FOLLOW: 如果path是一个符号链接,则调用出错
O_TRUNC:如果文件存在,则将文件长度清为0打开
O_SYNC:每次写操作要等待物理IO操作完成,包括该写操作引起的文件属性(如文件长度)更新所需的IO
O_DSYNC:每次写操作要等待物理IO操作完成,但是如果该写操作并未引起文件属性的改变,则不需要等待文件属性文件属性更新。
当文件打开模式中包含O_CREAT时,还必须提供所创建文件的权限
#include <unistd.h> int close(int fd);
close函数关闭打开的文件,进程结束时,系统会自动关闭打开的文件,但如果进程未结束时候则应及时关闭打开的文件,因为系统为每个进程打开的最大文件数目有限制
#include <unistd.h> off_t lseek(int fd, off_t offset, int whence);
lseek函数用来定位文件的位置,offset参数说明文件指针相对于whence移动多少个字节,whence参数有SEEK_SET,SEEK_CUR,SEEK_END三个标志,分别表示文件的首部,当前位置,尾部。当文件以O_APPEND参数打开时,该函数的这三个标志永远相同,都为文件尾部,而且,offset不能为负,即不能修改已写入的文件。由于lseek函数的offset参数可正可负,因此lseek失败时返回值为-1,其他返回值都有可能是成功的返回。
此外,lseek函数只是移动文件指针,并未引起任何的IO操作,该文件指针的位置引用于下一个IO操作
#include <unistd.h> ssize_t read(int fd, void *buf, size_t nbytes);
read函数从fd文件中读入nbytes字节的内容到buf中,成功时返回读入的字节数(有可能小于nbytes),遇到文件末尾是返回0,失败时返回-1
#include <unistd.h> ssize_t write(int fd, const void *buf, size_t nbytes);
write函数将buf中的nbytes字节内容写入fd文件中,成功时返回写入的字节数,失败时返回-1.通常情况下返回值都等于nbytes,否则出现了某些错误
#include <unistd.h> ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset); ssize_t pwrite(int fd, const void *buf, size_t nbytes, off_t offset);
出错时返回-1,成功时返回读/写的字节数
pread函数相当于先调用lseek再调用read,但是两者有重要区别,一是pread属于原子操作,不可拆分,而先调用lseek在调用read则两次调用中间文件可能被其他进程修改;二是pread不更新当前文件的偏移量
#include <unistd.h> int dup(int fd); int dup2(int fd, int fd2);
出错时返回-1,成功时返回新的文件描述符
dup为已经打开的文件返回一个新的文件描述符,该文件描述符一定是当前可用文件描述符中的最小值。dup2则是用fd2参数指定新的文件描述符,如果fd2所指文件已打开,则先关闭fd2所指文件;若fd等于fd2,则返回fd2而不关闭它。
#include <fcntl.h> int fcntl(int fd, int cmd, ... /* int arg */ );
出错时返回-1,成功时依赖于cmd
fcntl函数可以获得/修改文件的属性
cmd = F_DUPFD:复制文件描述符fd,返回新的文件描述符,它是尚未打开的文件描述符中大于或等于第三个参数的最小值
cmd = F_GETFD:返回fd
cmd = F_SETFD:设置新的文件描述符为第三个参数,
cmd = F_GETFL:返回文件状态标志
cmd = F_SETFL:设置文件状态标志(此时需要先得到旧的文件状态标志,与需要设置的文件状态标志按位做 | 运算,否则会将旧的文件标志所有位置清除
原文地址:http://blog.csdn.net/yuanliang01xiaolang/article/details/41518725