我有一个包含内容的文件foo.txt
foobar
我想不断地追加到这个文件,并有权访问修改后的文件。
MmapMut
我尝试的第一件事是直接改变mmap:
use memmap;
use std::fs;
use std::io::prelude::*;
fn main() -> Result<(), Box<std::error::Error>> {
let backing_file = fs::OpenOptions::new()
.read(true)
.append(true)
.create(true)
.write(true)
.open("foo.txt")?;
let mut mmap = unsafe { memmap::MmapMut::map_mut(&backing_file)? };
loop {
println!("{}", std::str::from_utf8(&mmap[..])?);
std::thread::sleep(std::time::Duration::from_secs(5));
let buf = b"somestring";
(&mut mmap[..]).write_all(buf)?;
mmap.flush()?;
}
}
这将导致死机:
Error: Custom { kind: WriteZero, error: StringError("failed to write whole buffer") }
生成的文件将读取somest
直接追加到备份文件
之后,我尝试直接添加到备份文件中:
use memmap;
use std::fs;
use std::io::prelude::*;
fn main() -> Result<(), Box<std::error::Error>> {
let mut backing_file = fs::OpenOptions::new()
.read(true)
.append(true)
.create(true)
.write(true)
.open("foo.txt")?;
let mmap = unsafe { memmap::MmapMut::map_mut(&backing_file)? };
loop {
println!("{}", std::str::from_utf8(&mmap[..])?);
std::thread::sleep(std::time::Duration::from_secs(5));
let buf = b"somestring";
backing_file.write_all(buf)?;
backing_file.flush()?;
}
}
这不会导致恐慌。该文件将定期更新,但我的mmap不会反映这些更改。我预计标准输出如下所示:
foobar
foobarsomestring
foobarsomestringsomestring
...
但我有
foobar
foobar
foobar
...
我主要对Linux解决方案感兴趣,如果它是平台相关的。
https://stackoverflow.com/questions/53714241
复制相似问题