如何使用直接IO编写一个带有扩展文件大小的小文件

how to use direct io write a small file with out extend file size

本文关键字:一个 扩展 文件大小 文件 小文 何使用 IO      更新时间:2023-10-16

如何使用直接io写一个带有更改文件大小的小文件。

假设我有一个文件,文件大小为1.1kb,我使用直接io读取文件,然后更改一些数据,然后写文件......

请参见下面的

//open file with O_DIRECT
handle_ = open("1.html", O_RDWR | O_DIRECT | O_SYNC | O_LARGEFILE,0777))
//file size is 1.1KB (i read 4KB)
pread64(handle_,buffer,4096,0);
memcpy(buffer,"11111",5);
//error (512b Aligned)
pwrite64(handle_,buffer,1.1KB,0);

//OK,but file size has been extended to 4KB 
pwrite64(handle_,buffer,4KB,0);

这是一个现实世界中的问题,因为某些软件也可能会使用此文件,例如WebServer,它将获得错误的文件大小和对客户端的响应。

(必须是直接的,我有理由(

如何使用直接io编写一个带有扩展文件大小的小文件

对不起,您不能-O_DIRECT需要I/O您的功能为512字节。假设KB是1024字节,1.1 * 1024 = 1126.4(这是一个奇怪的数字,因为它不会是整个字节(,因此您必须将其舍入到1536才能使用O_DIRECT,从而导致扩展。

您的选项仅限于:

  • 执行O_DIRECT写入,然后将文件截断为正确的大小(这听起来好像是您在做什么(。
  • 仅使用O_DIRECT写文件的完整块倍数,然后使用非O_DIRECT写入最后一点。

如果这两个听起来都很糟糕,那么我只能将您指向 @ted-lyngmo的请求以获取更多信息:

"必须是直接的,我有我的理由" - 愿意分享这些?

O_DIRECT带有大量使用规则...

我认为您可以在其MMAP SYSCALL中使用映射文件到内存中。还请查看此答案

相关文章: