open 函数的flag
int open(const *pathname, int falg, int parm)
O_RDONLY //文件只读
O_WRONLY //文件只写
O_CREAT //不存在时创建文件(存在就直接清空后覆写)
O_RDWR //文件读写
O_EXCL //与O_CREAT共同作用,在试图覆写时报错
O_TRUNC //从文件头开始覆写
O_APPEND //在文件尾追加写入
- open的第三个参数,只在O_CREAT存在下有用,用于控制其创建的权限(如 0777, 0666)
- open的O_EXCL参数,与O_CREAT共同作用,再其文件存在时直接报错,防止文件被清空
- 上述错误可以结合errno.h的库 通过perror()打印错误
lseek()函数
off_t lseek(int fd, off_t offset, int whence)
- whence为当前文件指针的基点
- SEEK_SET
- SEEK_CUR
- SEEK_END
- 返回值是实际指针偏移的值
- len = lseek(fd, 0, SEEK_END)
可以返回文件的长度
lseek也可以制作空洞文件
即中间通过指针的移动,跳过一段,即制造了文件空洞
(用于多线程的文件写,想想迅雷,差不多的)
当文件被同一进程打开两次的时候
得到两个fd的值,就会有两个文件的指针,
当对文件进行读写时,两个指针从头开始写,两个写入的内容会相互覆盖,同样的,读取的文件会重复,
这时,给出其open()同时加入O_APPEND参数,这样就可以同步读写了
fd1 = open(FILEPATH, O_RDWR | O_APPEND)
fd2 = open(FILEPATH, O_RDWR | O_APPEND)