【问题标题】:How to cache/buffer the data before write operation如何在写操作之前缓存/缓冲数据
【发布时间】:2013-06-20 11:29:35
【问题描述】:

我的目的是减少对内核的文件写入操作,因此在 POSIX 上寻找缓存/缓冲机制。我相信标准 C 库 setbuf 可以做到这一点,但在 POSIX 中是否有类似的调用?

例如我想将缓冲区大小设置为 1Kbytes,并且不希望我的程序在超出缓冲区大小之前启动对磁盘的实际写入操作。

fdpipe= open(PIPE_NAME,O_RDONLY);
......

fd = open(filename,O_CREAT|O_WRONLY|O_TRUNC|O_LARGEFILE,S_IREAD|S_IWRITE);
....

while((len = read(fdpipe,buffer,sizeof(buffer))) > 0) {
     ....
     ret = write(fd,buffer,length = strlen(buffer));
}

【问题讨论】:

    标签: c caching buffer posix


    【解决方案1】:

    为什么不简单地使用 stdio 工具呢?您可以使用fdopen 创建一个FILE*,它将读取/写入给定的文件描述符,然后使用setvbuf 设置您想要的缓冲区大小。

    fdpipe = open(PIPE_NAME,O_RDONLY);
    ......
    
    fd = open(filename,O_CREAT|O_WRONLY|O_TRUNC|O_LARGEFILE,S_IREAD|S_IWRITE);
    FILE* outf = fdopen(fd, "wb");
    char obuffer[1024];
    setvbuf(outf, obuffer, _IOFBF, sizeof(obuffer));
    ....
    
    while((len = read(fdpipe,buffer,sizeof(buffer))) > 0) {
         ....
         ret = fwrite(buffer,1,length = strlen(buffer),outf);
    }
    

    【讨论】:

    • 没错,但据我所知,用户要求使用 setbuf 以外的另一种方法。
    • @KorayAlkan 哎呀-我的意思是setvbuf。千万不要在喝咖啡前回答。
    【解决方案2】:

    您只需将数据保存在自己的程序缓冲区中。不要调用 write() 系统调用,直到您自己的缓冲区达到 1K。然后,调用 write() 和 flush()。这对你不好吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-02
      • 2016-07-10
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      相关资源
      最近更新 更多