首页 > 代码库 > 文件IO

文件IO

创建一个空洞文件

#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

 

文件IO