Io 文件句柄超出范围时如何关闭?

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(

我不明白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());
在文件超出范围时,编译器应插入指令以释放内存。如果我对阻塞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平台,
文件
在mod
sys::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的实现。我更新了一个问题。这似乎是正确的答案。谢谢:)