2011 -8-24 补充:
1、这里的缓冲不缓冲是针对用户进程而言,磁盘IO肯定会经过内核的高速缓冲,而标准IO呢也使用了缓存(类似我们程序中的BUFFER),如果在标准IO中直接调用系统调用的fsync呢,也不能把缓冲刷到磁盘或者输出中,因为BUFFER在标准IO的缓存中,这时候还需要标准IO的fflush将缓存刷到内核的缓存,然后再fsync才会有作用
2、我这里的例子也是有些问题,用了同样的文件,会不会直接就放到了系统缓存中下一次就不需要读取了(3.9后面也有提醒这个,没有注意)。然后再实验不同文本发现差不多
================分割线
这两天又看APUE,看了前三章,里面的IO、系统调用刚好不太明白。就调研了一番
代码如下:
#include "unistd.h"
//unistd 不带缓冲的io函数,需要自己设立缓冲区,调用系统库
#include "stdio.h"
#define MAXSIZE 16384 //20480 //10240 //32768 // 81920 //1//16384 //4096
/*
* read write的返回值与参数。
* read 参数为最大空间,返回已经读取的字节数
* write 参数为想要写的字节数,返回实际写的字节书
*/
int main(int argc,char * argv[])
{
char BUFFER[MAXSIZE];
int n;
while( (n= read(STDIN_FILENO,BUFFER,MAXSIZE)) > 0)
if( write(STDOUT_FILENO,BUFFER,n) != n)
printf("写错误\n");
if( n<0 )
printf("读错误\n");
return 0;
}
shaw@xxxx $ time ./ne_io < ~/Ebook/apue2.pdf > ~/Ebook/apue3.pdf
缓冲区大小 1
real 0m35.791s
user 0m1.344s
sys 0m34.162s
缓冲区大小 81,920
real 0m0.040s
user