Io 文件句柄超出范围时如何关闭?
我不明白Rust在文件句柄超出范围时会做什么。例如,我创建了一个文件,并在其中写入了几个单词:Io 文件句柄超出范围时如何关闭?,io,rust,Io,Rust,我不明白Rust在文件句柄超出范围时会做什么。例如,我创建了一个文件,并在其中写入了几个单词: let wd = os::getcwd().unwrap_or(Path::new("/")); let mut file = File::create(&Path::new("daemon_log.txt")); file.write_all(format!("DAEMON CWD: {}", wd.as_str().unwrap_or("some problems")).as_bytes(
let wd = os::getcwd().unwrap_or(Path::new("/"));
let mut file = File::create(&Path::new("daemon_log.txt"));
file.write_all(format!("DAEMON CWD: {}", wd.as_str().unwrap_or("some problems")).as_bytes());
在文件超出范围时,编译器应插入指令以释放内存。如果我对阻塞IO通常是如何实现的理解是正确的,那么,除了释放内存外,进程还应该释放一些锁
我担心的是,在文件的源代码中,我找不到编译器执行此操作的任何提示。说所有的魔法都用于文件
的Drop
trait的实现,但现在似乎不是这样,因为我在std::ops.rs
和std::old_io::fs.rs
中都找不到Drop
trait实现
更新
我再次检查了File
s对write\u all
的实现,发现write
方法与一些描述符(FileDesc
)一起工作。我还没有在文档中找到关于它的任何相关信息,所以去GitHub找到了。这看起来像是我问题的答案,但我被评论中的一句话弄糊涂了:
//关闭stdio文件句柄没有意义,所以永远不要这样做
这是什么意思?我不应该自己在fd上调用libc::close
?或者他们自己不确定该如何实施?例如,请参见指定“防坠装置”的示例
Update(对于您的更新):stdio句柄是STDIN、STDOUT和STDERR,关闭它们没有任何意义(后台监控除外),因此在正常IO操作期间不会执行此操作。对于POSIX平台,文件
在modsys::fs2
中定义为结构文件(FileDesc)
,其中FileDesc
是围绕文件描述符编号的包装。关闭文件:
impl Drop for FileDesc {
fn drop(&mut self) {
// closing stdio file handles makes no sense, so never do it. Also, note
// that errors are ignored when closing a file descriptor. The reason
// for this is that if an error occurs we don't actually know if the
// file descriptor was closed or not, and if we retried (for something
// like EINTR), we might close another valid file descriptor (opened
// after we closed ours.
if self.fd > libc::STDERR_FILENO {
let _ = unsafe { libc::close(self.fd) };
}
}
}
Windows平台的实现将文件
定义为句柄
值的包装,该值的析构函数。抱歉,不了解它与文件的关系。但它让我再次检查Writer的实现。我更新了一个问题。这似乎是正确的答案。谢谢:)