文件I/O(不带缓冲)之I/O的效率

程序清单3-3中的程序使用read和write函数复制文件。关于该程序应注意下列各点:

它从标准输入读,写至标准输出,这就假定在执行本程序之前,这些标准输入、输出已由shell安排好。确实,所有常用的UNIX系统shell都提供一种方法,它在标准输入上打开一个文件用于读,在标准输出上创建(或重写)一个文件。这使得程序不必自行打开输入和输出文件。

很多应用程序假定标准输入是文件描述符0,标准输出是文件描述符1。本示例中则使用在<unistd.h>中定义的两个名字:STDIN_FILENO和STDOUT_FILENO。

考虑到进程终止时,UNIX系统内核会关闭该进程的所有打开的文件描述符,所以此示例并不会关闭输入和输出文件。

对UNIX系统内核而言,文本文件和二进制代码文件并无区别,所以本示例对这两种文件都能工作。

程序清单3-3 将标准输入复制到标志输出

[root@localhost apue]# cat prog3-3.c
#include "apue.h"

#define BUFFSIZE 4096

int
main(void)
{
        int n;
        char buf[BUFFSIZE];

        while((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
        {
                if(write(STDOUT_FILENO, buf, n) != n)
                        err_sys("write error");
        }
        if(n < 0)
                err_sys("read error");
        exit(0);
}

这里有一个问题是,如何选取BUFFSIZE值?

用程序清单3-3中的程序读文件,其标准输出被重定向到/dev/null上。此测试所用的文件系统是Linux ext2文件系统,其块长是4096字节(块长由st_blksize表示)。发现,系统CPU时间的最小值出现在BUFFSIZE为4096处,继续增加缓冲区长度对此时间几乎没有影响。

大多数文件系统为改善其性能都采用某种预读(read ahead)技术。当检测到正进行顺序读取时,系统就试图读入比应用程序所要求的更多的数据,并假想应用程序很快就会读这些数据。

 

本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/

posted @ 2013-12-30 17:58  ITtecman  阅读(514)  评论(0编辑  收藏  举报