【发布时间】:2022-11-07 21:10:50
【问题描述】:
我在 rust 中有以下代码:
use anyhow::{Result, Error};
use async_std::fs::{File, OpenOptions};
use async_std::io::{ReadExt, WriteExt};
async fn open_log_file() -> Result<File, Error> {
// Create the file data that will be written to disk.
let mut file_bytes = [0u8; FILE_MAGIC.len()];
file_bytes[..].copy_from_slice(FILE_MAGIC.as_bytes());
// Write the file data to disk.
let mut f = File::create(FILE_NAME).await.context("unable to create file")?;
f.write_all(&file_bytes).await.context("unable to write file magic")?;
// return the file handle
Ok((f))
}
问题是如果你让它运行,这段代码不会向磁盘写入任何内容。如果您向程序发送终止信号,它最终会将所有数据写入磁盘。如果你再调用 f.write_all() 几次,一些数据最终会以看似任意的数据包的形式进入磁盘。
但是如果你让它挂起,它可能会等待几个小时,直到你关闭程序/关闭文件句柄,你的数据才会被写入磁盘。在 write_all 调用之后调用 f.flush()不是似乎有帮助。
如何确保在堆栈中的某处进行系统调用以实际将数据写入磁盘,同时仍不阻塞线程?让我非常困惑的是,未来将在没有实际将数据写入磁盘的情况下解决。
【问题讨论】:
-
调用
f.flush()不起作用,但调用f.flush().await确实起作用,这是我的错误
标签: rust