今天开始学习《UNIX环境高级编程》的第三章文件I/O的学习,本章包括了打开文件、读文件、写文件等等。下面是系统的介绍这些函数。
1.open函数
O_RDONLY 只读打开。
O_WRONLY 只写打开。
O_RDWR 读写打开。
有且仅有一个这三个参数之中的一个被指定。下面的参数则是可选的。
O_APPEND 每次写的时候追加到文件的结尾。详见3.11
O_CREAT 如果文件不存在在创建一个文件,这个选项需要第三个open函数的第三个参数----mode,指定新文件得到的允许位。详见4.5
O_EXCL 如果O_CREAT被指定而且文件已经存在则产生一个错误。详见3.11
O_TRUNC 如果文件存在而且已只读或者读写的方式打开,则文件截断为0。
O_NOCTTY 如果pathname指定的是一个终端设备,不为此进程分配此设备的控制终端。详见9.6
O_NONBLOCK 如果parhname指定的是一个FIFO,一个块设备,或者一个特殊字节设备,此选项为本次打开文件和后续的非阻塞I/O操作。
下面的三个参数也是可选的,他们是有关同步输出和输入的选项。
D_DSYNC 使每次write等待物理I/O操作完成,但是如果写操作并不影响读取刚写入的数据,则不等待文件属性被更新。
O_RSYNC 使每一个以文件描述符作为参数的read操作等待,直至任何文件同一部分进行的未写操作都完成
O_SYNC 使每次write都等待物理I/O操作完成,包括write操作引起的文件属性更新所需的I/O
2.creat函数
也可调用creat函数创建一个新文件。
#include <fcntl.h>
int creat(const char *pathname, mode_t mode);
//Return:file descriptor opened for write-only if OK,-1 on error
#include <fcntl.h>
int creat(const char *pathname, mode_t mode);
//Return:file descriptor opened for write-only if OK,-1 on error
这个函数等价于
open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);
open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);
creat函数只能创建一个只写的文件,如果要创建一个临时文件,先读后写然后再调用creat,close,最后在open,最好的方式是调用open函数如下所示
open(pthname, O_RDWR | O_CREAT | O_TRUNC, mode);
open(pthname, O_RDWR | O_CREAT | O_TRUNC, mode);
3.close 函数
文件调用close函数结束
#include <unistd.h>
int close(int filedes);
//Return:0 if OK,-1 on error
#include <unistd.h>
int close(int filedes);
//Return:0 if OK,-1 on error
4.lseek 函数
#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence);
// Return:new file offset if OK, -1 on error
#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence);
// Return:new file offset if OK, -1 on error
对offset参数的解释和whence有关
若whence是SEEK_SET,则将该文件的偏移量设置为距文件开始处offset个字节
若whence是SEEK_CUR,则将该文件的偏移量设置为其当前值加offset,offset可正也可为负。
若whence是SEEK_END,则将文件的偏移量设置为文件长度加offset,offset可为正或负。
若lseek成功执行,则返回文件的偏移量,可以用下列方式查看当前打开文件的偏移量。
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);