c - 如何在写操作之前缓存/缓冲数据

标签 c caching buffer posix

我的目的是减少对内核的文件写入操作,因此在 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));
}

最佳答案

为什么不简单地使用 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);
}

关于c - 如何在写操作之前缓存/缓冲数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17212458/

相关文章:

c - 如何清除 C 中的输入缓冲区?

c - 正确的分配语法

c - c 位域的平台独立存储

php - Memcached 在 Symfony2+Doctrine2 应用程序负载下显着变慢

jquery - 如何防止 jQuery Ajax 缓存?

c++ - InternetReadFile 填充缓冲区,但返回读取的零字节

emacs - 如何使用显示下一个缓冲区的新窗口自定义 Emacs split-window-X?

c - 用 C 替换文本文件中的行

c - pod2man 失败,预期文本不是数字

.htaccess - 强制浏览器忘记缓存的重定向?