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系统上都是一样的。为什么?