ssize_t read(int filedes, void *buf, size_t nbytes);
read函数从打开的文件中读取数据;如果成功则返回读取的字节数,如果已经到文件结尾则返回0,如果出错则返回-1
nbytes是要求读取的字节数,读取之后存放在缓冲区buf中,同时文件读写位置后移;当函数返回,buf中前返回值个字节是读取来的,而实际读取的返回值字节数有可能会小于请求读取的字节数nbytes,也就是请求的nbytes比到达文件末尾的字节数多
ssize_t write(int filedes, const void *buf, size_t nbytes);
write函数向打开的文件中写数据;如果成功则返回已写的字节数,如果出错则返回-1
对于普通的文件,函数的返回值应该和请求写的字节数nbytes一致
为了说明buf和缓冲区大小,下面是APUE上的一个例子:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define BUFFSIZE 4096
int main(){
int n;
char buf[BUFFSIZE];
while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
if (write(STDOUT_FILENO, buf, n) != n){
printf(“write error\n”);
exit(1);
}
if (n < 0){
printf(“read error”);
exit(1);
}
return 0;
}
为了通过不同的缓冲区长度来进行测试程序的运行结果,BUFFSIZE范围在1~524288,然后读取的字节数为103316352,在Linux ext2文件系统上,系统CPU时间最小值出现在BUFFSIZE为4096的时候,继续增加缓冲区性能没啥影响甚至略降
大多数文件系统为了提高性能都会采用预读(read ahead)技术;当检测到正进行顺序读取时,系统就试图读入比应用程序所要求更多的数据,并假象应用程序很快就会读这些数据;在ext2上,当BUFFSIZE为128KB的时候,预读取停止了,这就对读操作的性能产生了影响
操作系统通过缓存将相关程序文件放到主存里,如果后序还要运行该程序一般从系统缓存访问文件,性能都会比第一次好,而无需读写磁盘