此处介绍的函数都属于低级IO,也即不带缓冲的IO。
主要涉及函数:open read write lseek close dup dup2 fcntl ioctl sync fsync fdatasync
1. open 为进程打开或创建文件
[code]
#include
#include
#include
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
[/code]
其中:
为进程返回打开此文件的文件描述符
pathname为需要打开或创建的文件的路径
flags为如下常量:
O_RDONLY - 只读打开
O_WRONLY - 只写打开
O_RDWR - 读写打开
这三个常量互斥、每次只能使用一个
下面几个选项是可选的:
O_APPEND - 每次写的时候追加到文件尾
O_CREAT - 如果文件不存在,则创建之。使用此参数时需要同时使用open的第三个参数指定文件权限
O_EXCL - 如果同时使用了O_CREAT,而文件已经存在的话则会出错(使用这两个选项的话检测和创建文件则成为了一个源自操作)
O_TRUNC - 如果文件存在,并且文件已写或读写方式打开,则清空文件
O_NOCTTY - 如果pathname指定的为一个字符终端设备,则不将该设备分配作为改进程的控制终端
O_NONBLOCK - 如果pathname指定的为一个FIFO、块或者字符设备,则此选项为文件的本次打开操作和后续IO操作设置为非阻塞模式。
O_DSYNC - 使每次write都等待物理IO操作完成,但是如果写操作并不影响读取刚写入的数据,则不等待文件属性的更新。
O_RSYNC - 使每一个以文件描述符作为参数的read操作等待,直至任何对文件同一部分进行的未决写操作都完成。
O_SYNC - 使每次写都等待物理IO操作完成,包含文件属性的更新所需的IO操作。
2. create
[code]
#include
int creat(const char *pathname, mode_t mode);
[/code]
相当于open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode)
3. close
[code]
#include
int close(int fd);
[/code]
4. lseek
[code]
#include
off_t lseek(int fd, off_t offset, int whence);
[/code]
其中: SEEK_SET(0) 表示文件开始处 SEEK_CUR(1) 表示文件当前偏移量 SEEK_END(2) 表示文件结尾
5. read
[code]
#include
ssize_t read(int fd, void *buf, size_t count);
[/code]
返回读到字节数,如果到了文件结束,则返回0,出错返回-1
6. write
[code]
#include
ssize_t write(int fd, const void *buf, size_t count);
[/code]
返回值与count相等时表示写成功,反之表示写文件失败
7. pread/pwrite
[code]
#include
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
[/code]
原子操作,定位并进行读写
8. 由于此处介绍的文件IO都是不带缓冲的IO,所以一次读写的数量对IO的效率影响很大
9. dup/dup2多用于进程间文件共享,此处不多介绍,可以参考man手册
a. sync/fsync/fdatasync也不再多说
b. 另外fcntl和ioctl两个超级强大的函数在此也不再介绍了
阅读(1909) | 评论(0) | 转发(0) |