C++ 是否可以写入mmap';在没有得到总线错误的情况下创建一个文件

C++ 是否可以写入mmap';在没有得到总线错误的情况下创建一个文件,c++,c,mmap,C++,C,Mmap,当内容从0更改为1时,我正在尝试监视为其创建的文件。这段代码创建文件并将其映射好,然后旋转,等待*map的内容从'0'更改为'1' 但是,当我运行echo 1>file.dat时,代码会因总线错误而崩溃 我假设这是因为echo(或我尝试的其他任何东西)正在创建一个新文件,而mmap不再指向相关的内容。有什么办法可以让这一切顺利进行吗 int fd = open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600); write(

当内容从
0
更改为
1
时,我正在尝试监视为其创建的文件。这段代码创建文件并将其映射好,然后旋转,等待
*map
的内容从
'0'
更改为
'1'

但是,当我运行
echo 1>file.dat
时,代码会因
总线错误而崩溃

我假设这是因为echo(或我尝试的其他任何东西)正在创建一个新文件,而mmap不再指向相关的内容。有什么办法可以让这一切顺利进行吗

int fd = open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600);

write(fd, "0", 1)

char* map = static_cast<char*>(mmap(0, 1, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
int fd=open(filename.c_str(),O_RDWR | O|u CREAT | O|u TRUNC,(mode_t)0600);
写入(fd,“0”,1)
char*map=static_cast(mmap(0,1,PROT_READ,PROT_WRITE,map_SHARED,fd,0));

echo 1>文件执行以下操作:

  • 将_文件
  • 截断为0字节
  • 将字符
    1
    \n
    附加到
    文件中
  • 在步骤1和步骤2之间,文件的长度为0

    (步骤1由shell执行,当它解释重定向
    >到_文件
    时。步骤2由
    echo
    命令执行,因此两者之间可能有相当长的时间。)

    如果要覆盖文件的一个字符,可以使用
    dd

    echo 1 | dd of=the_file bs=1 count=1 conv=notrunc
    

    echo 1>_文件执行以下操作:

  • 将_文件
  • 截断为0字节
  • 将字符
    1
    \n
    附加到
    文件中
  • 在步骤1和步骤2之间,文件的长度为0

    (步骤1由shell执行,当它解释重定向
    >到_文件
    时。步骤2由
    echo
    命令执行,因此两者之间可能有相当长的时间。)

    如果要覆盖文件的一个字符,可以使用
    dd

    echo 1 | dd of=the_file bs=1 count=1 conv=notrunc
    

    echo 1>_文件执行以下操作:

  • 将_文件
  • 截断为0字节
  • 将字符
    1
    \n
    附加到
    文件中
  • 在步骤1和步骤2之间,文件的长度为0

    (步骤1由shell执行,当它解释重定向
    >到_文件
    时。步骤2由
    echo
    命令执行,因此两者之间可能有相当长的时间。)

    如果要覆盖文件的一个字符,可以使用
    dd

    echo 1 | dd of=the_file bs=1 count=1 conv=notrunc
    

    echo 1>_文件执行以下操作:

  • 将_文件
  • 截断为0字节
  • 将字符
    1
    \n
    附加到
    文件中
  • 在步骤1和步骤2之间,文件的长度为0

    (步骤1由shell执行,当它解释重定向
    >到_文件
    时。步骤2由
    echo
    命令执行,因此两者之间可能有相当长的时间。)

    如果要覆盖文件的一个字符,可以使用
    dd

    echo 1 | dd of=the_file bs=1 count=1 conv=notrunc
    


    @MichaWiedenmann:lol“情绪化”?好吧,我想这反映了你所付出的努力:)你能不能至少在例如处设置一个复制问题的样本。你可以捕捉SIGBUS并重新检查,直到成功…@Salgar:你也可以重复
    getc
    回放文件,而不是内存映射。如果文件只有一个字节长,那么实际上可能会更有效率。@MichaWiedenmann:lol“情绪化”?嗯,我想这反映了所付出的努力:)你能至少在,你可以抓住SIGBUS并重新检查直到成功…@Salgar:你也可以重复
    getc
    revend
    文件,而不是内存映射。如果文件只有一个字节长,那么实际上可能会更有效率。@MichaWiedenmann:lol“情绪化”?嗯,我想这反映了所付出的努力:)你能至少在,你可以抓住SIGBUS并重新检查直到成功…@Salgar:你也可以重复
    getc
    revend
    文件,而不是内存映射。如果文件只有一个字节长,那么实际上可能会更有效率。@MichaWiedenmann:lol“情绪化”?嗯,我想这反映了所付出的努力:)你能至少在,你可以抓住SIGBUS并重新检查直到成功…@Salgar:你也可以重复
    getc
    revend
    文件,而不是内存映射。如果文件只有一个字节长,那么实际上效率可能会更高。好吧,问题似乎不是特定于linux的,还是它?@πάνταῥεῖ: 不,在任何posix系统上都是一样的。为什么?因为不是每个posix兼容系统都有
    dd
    可用。@πάνταῥεῖ: 根据Posix(),它是在第2期中添加的。那是很久以前的事了。@salgar
    /proc
    中的“文件”不是真正的文件。它们是实现(某些)文件操作的内核函数。大多数
    /proc/..
    文件无法被截断,因此shell(静默)完成的
    trunc
    调用失败。好吧,问题似乎不是linux特定的,还是?@πάνταῥεῖ: 不,在任何posix系统上都是一样的。为什么?因为不是每个posix兼容系统都有
    dd
    可用。@πάνταῥεῖ: 根据Posix(),它是在第2期中添加的。那是很久以前的事了。@salgar
    /proc
    中的“文件”不是真正的文件。它们是实现(某些)文件操作的内核函数。大多数
    /proc/..
    文件无法被截断,因此shell(静默)完成的
    trunc
    调用失败。好吧,问题似乎不是linux特定的,还是?@πάνταῥεῖ: 不,在任何posix系统上都是一样的。为什么?