C 带孔锉刀

C 带孔锉刀,c,mmap,C,Mmap,我正在以以下方式尝试mmap,但我无法理解它是否正确: #include <fcntl.h> // open #include <unistd.h> // ftuncate #include <sys/mman.h> // mmap #include <cstdlib> #include <cstring> #include <cstdio> int main(){ off_t const size =

我正在以以下方式尝试mmap,但我无法理解它是否正确:

#include <fcntl.h>  // open
#include <unistd.h> // ftuncate
#include <sys/mman.h>   // mmap

#include <cstdlib>
#include <cstring>
#include <cstdio>


int main(){
    off_t const size = 5 * 1024 * 1024;
    const char *filename = "testfile";

    int fd = open(filename, O_RDWR | O_TRUNC | O_CREAT, 0644);
    ftruncate(fd, size);

    char *mem = (char *) mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, /* offset */ 0);

    const char *msg = "Hello";

    memcpy(&mem[100], msg, strlen(msg));

    memcpy(&mem[200], msg, strlen(msg));

    memcpy(&mem[4 * 1024 * 1024], msg, strlen(msg));
}
#包括//打开
#包括//ftuncate
#包括//mmap
#包括
#包括
#包括
int main(){
off_t const size=5*1024*1024;
const char*filename=“testfile”;
int fd=open(文件名,O|RDWR | O|TRUNC | O|u CREAT,0644);
ftruncate(fd,尺寸);
char*mem=(char*)mmap(空ptr、大小、保护读取、保护写入、映射共享、fd、/*offset*/0);
const char*msg=“你好”;
memcpy(&mem[100],msg,strlen(msg));
memcpy(&mem[200],msg,strlen(msg));
memcpy(&mem[4*1024*1024],msg,strlen(msg));
}
据我所知,
ftruncate
创建一个有洞的文件。这对以后的
mmap
不是问题吗

这对64位系统上的10GB文件有效吗


在Linux上,我应该使用fallocate(fd,FALLOC\u FL\u ZERO\u RANGE,0,8*大小)还是速度没有显著差异?

文件中的漏洞对任何正常的文件操作都没有影响,它们只是文件存储在磁盘上的方式的优化。就任何操作而言,如读取、查找、内存映射等,它只是一个很长的零字节序列。当将相关页面读入内存时,文件系统驱动程序负责将洞变成一块零


有关
fallocate()
ftruncate()
之间的区别,请参见文件中的漏洞对任何正常的文件操作都没有影响,它们只是优化了文件在磁盘上的存储方式。就任何操作而言,如读取、查找、内存映射等,它只是一个很长的零字节序列。当将相关页面读入内存时,文件系统驱动程序负责将洞变成一块零


<> > <代码> > FalCuffe()/>代码>和<>代码> ftuncTeEE()/<代码>,参见

对不起,例如,我使用C++编译器在代码<> MAMP()> /Cord> >带有孔的文件工作良好。它处理的是逻辑数据,而不是物理磁盘块。因此,它会“重新填充”漏洞,最后所有数据都正确地存储在磁盘上?一切都是一样的。文件中的漏洞只是一种优化,它们对您访问文件的方式没有影响。@Barmar:它们有一些影响:如果设备上有ENOSPC,则写入漏洞可以
SIGBUS
。您希望<代码> PosixyFalPosie/Cux>而不是通过一个讨厌的信号来处理这个过程。抱歉,例如,我使用C++编译器在代码< MAMP()> /COD>使用带有孔的文件工作得很好。它处理的是逻辑数据,而不是物理磁盘块。因此,它会“重新填充”漏洞,最后所有数据都正确地存储在磁盘上?一切都是一样的。文件中的漏洞只是一种优化,它们对您访问文件的方式没有影响。@Barmar:它们有一些影响:如果设备上有ENOSPC,则写入漏洞可以
SIGBUS
。您希望posix_fallocate同步处理此问题,而不是通过讨厌的信号。