创建一个空洞文件
#include <fcntl.h> #include <unistd.h> #include <cstring> int main(){ int fd=open("hole",O_WRONLY | O_CREAT,0666); write(fd,"1G hole are coming",strlen("1G hole are coming")); lseek(fd,1024*1024,SEEK_CUR); write(fd,"1G hole are ending",strlen("1G hole are ending")); close(fd); return 0; }
open 返回文件描述符 头文件<fcntl.h>
参数说明
a,至少且只能指定一个:O_RDONLY O_WRONLY O_RDWR
b,可选择的:O_APPEND(写追加) O_CREAT(不存在则创建,指定mode) O_EXCL(先测试是否存在,载创建)
O_TRUNC(若打开的文件可写,将其长度截短为0) O_NOCTTY(不将设备作为进程的控制终端) O_NONBLOCK(非阻塞模式)
lseek 返回文件偏移量(off_t) close 头文件<unistd.h>
lseek参数:SEEK_SET SEEK_CUR SEEK_END offset可正可负
使用lseek允许造成文件空洞,空洞部分并不占用磁盘存储空间
cat hole > hole.copy 所有的空洞都会被填为0,hole.copy的占用磁盘为1M
read 返回已读取的字节数 <unistd.h>
write 若文件以O_APPEND打开,每次写时都会先移到文件末尾,然后写
pread 和 pwrite
ssize_t pread ( int filedes, void *buf, size_t nbytes, off_t offset); //lseek+read/write的原子操作
int dup(int fd);int dup2(int fd, int fd2);
dup是将fd复制给最小未使用的fdd,up2相当于一个原子操作,首先关闭fd2,然后再复制到fd2上
void sync(void); int fsync(int fd); int fdatasync(int fd);
sync.是强制将所有页面缓冲区都更新到磁盘上。
fsync.是强制将某个fd涉及到的页面缓存更新到磁盘上(包括文件属性等信息).
fdatasync.是强制将某个fd涉及到的数据页面缓存更新到磁盘上。
int fcntl(int fd, int cmd, ...); 改变已打开的文件的性质 <fcntl.h>
cmd:
F_DUPFD 复制一现有的描述符
F_GETFD/F_SETFD 获取/设置文件描述符标志
F_GETFL/F_SETFL 获取/设置文件状态标志
F_GETOWN/F_SETOWN 获取/设置异步IO所有权
F_GETLK,F_SETLK,F_SETKW 获取/设置记录锁
ioctl