APUE,TLPI读书笔记——linux IO相关
2016-05-11 09:39
791 查看
文件描述符:一个非负整数,是内核打开文件表的索引。
每一个进程有自己的文件描述符表,内核会维护一个打开文件表,不同的描述符指向内核的文件打开表,并指向I-node表上的文件实际位置。
linux系统的文件IO函数(具体使用详情可以在linux shell中 man -a + 函数名查询或者在man-online上查询):
fd=open(pathname,flags,mode);
numread=read(fd,buffer,count);//读取至多count字节,返回读到字节数
numwritten=write(fd,buffer,count);
status=close(fd);
currpos=lseek(fd,offset,whence);//返回文件新文件偏移量
int ioctl(int fildes, int request, .../*arg */);//控制一个流设备
flags=fcntl(fd,cmd,...);//文件控制操作
newfd=dup(oldfd)//在进程文件描述符表中创建文件描述符的副本
newfd=dup2(oldfd,newfd)//能够对已经存在fd进行操作。如果之前打开,会关闭
newfd=dup3(oldfd,newfd,flags);
pread,pwrite函数在offset参数处读写,不会改变文件偏移,适用于多线程读写
readv,writev(分散输入,集中输出)输入/输出到iovec指针数组指向的缓冲区中
truncate(pathname,length),ftruncate(fd,length)截断文件,设置文件大小为length,多丢少补(会造成空洞)
open或fcntl中设置O_NONBLOCK标志,可为非阻塞IO
大文件IO,open64,fopen64,lseek64等等
/dev/fd查看文件描述符(linux所有都会以文件形式反应)
mkstemp(template),FILE* tmpfile(void)创建临时文件。后者会创建一个名字唯一临时文件,文件流关闭后自动删除
C标准库:
对底层系统读写的包装
具体介绍可以参考:
C标准IO
文件IO缓冲
read,write操作磁盘不会直接磁盘访问,而是在用户空间缓冲区与内核缓冲区之间复制数据。
根据读写数据的大小选择合适的缓冲区大小,优化读写效率
C标准库的缓冲:setvbuf设置缓冲区1.不缓冲;2.行缓冲;3.全缓冲;fflush刷新缓冲区。
fsync()调用缓冲数据与fd相关的刷新到磁盘
fdatasync()与fsync()类似,只是强制文件处于synchronized IO data integrity completion状态
网上查到的:
synchronized IO data integrity completion:确保针对文件的一次更新传递了足够的信息(部分文件元数据)到磁盘,以便于之后对数据的获取。
synchronized IO file integrity completion:确保针对文件的一次更新传递了所有的信息(所有文件元数据)到磁盘,即使有些在后续对文件数据的操作并不需要。
sync则是更新所有包含文件信息的内核缓冲区都刷新到磁盘
posix_advise提供对内核的IO模式建议,详情man
文件的O_DIRECT标志绕过缓冲区直接IO
每一个进程有自己的文件描述符表,内核会维护一个打开文件表,不同的描述符指向内核的文件打开表,并指向I-node表上的文件实际位置。
linux系统的文件IO函数(具体使用详情可以在linux shell中 man -a + 函数名查询或者在man-online上查询):
fd=open(pathname,flags,mode);
numread=read(fd,buffer,count);//读取至多count字节,返回读到字节数
numwritten=write(fd,buffer,count);
status=close(fd);
currpos=lseek(fd,offset,whence);//返回文件新文件偏移量
int ioctl(int fildes, int request, .../*arg */);//控制一个流设备
flags=fcntl(fd,cmd,...);//文件控制操作
newfd=dup(oldfd)//在进程文件描述符表中创建文件描述符的副本
newfd=dup2(oldfd,newfd)//能够对已经存在fd进行操作。如果之前打开,会关闭
newfd=dup3(oldfd,newfd,flags);
pread,pwrite函数在offset参数处读写,不会改变文件偏移,适用于多线程读写
readv,writev(分散输入,集中输出)输入/输出到iovec指针数组指向的缓冲区中
truncate(pathname,length),ftruncate(fd,length)截断文件,设置文件大小为length,多丢少补(会造成空洞)
open或fcntl中设置O_NONBLOCK标志,可为非阻塞IO
大文件IO,open64,fopen64,lseek64等等
/dev/fd查看文件描述符(linux所有都会以文件形式反应)
mkstemp(template),FILE* tmpfile(void)创建临时文件。后者会创建一个名字唯一临时文件,文件流关闭后自动删除
C标准库:
对底层系统读写的包装
具体介绍可以参考:
C标准IO
文件IO缓冲
read,write操作磁盘不会直接磁盘访问,而是在用户空间缓冲区与内核缓冲区之间复制数据。
根据读写数据的大小选择合适的缓冲区大小,优化读写效率
C标准库的缓冲:setvbuf设置缓冲区1.不缓冲;2.行缓冲;3.全缓冲;fflush刷新缓冲区。
fsync()调用缓冲数据与fd相关的刷新到磁盘
fdatasync()与fsync()类似,只是强制文件处于synchronized IO data integrity completion状态
网上查到的:
synchronized IO data integrity completion:确保针对文件的一次更新传递了足够的信息(部分文件元数据)到磁盘,以便于之后对数据的获取。
synchronized IO file integrity completion:确保针对文件的一次更新传递了所有的信息(所有文件元数据)到磁盘,即使有些在后续对文件数据的操作并不需要。
sync则是更新所有包含文件信息的内核缓冲区都刷新到磁盘
posix_advise提供对内核的IO模式建议,详情man
文件的O_DIRECT标志绕过缓冲区直接IO
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍