#vim80/defaults.vim:99-102
autocmd BufReadPost * \
if line("'\"") >= 1 && line("'\"") <= line("$") | \
exe "normal! g`\"" | \
endif
的第二次运行将崩溃而不会显示错误消息。当我删除此foo()
行时,它可以正常工作。
unsafe
use std::process::{Command, Stdio};
use std::os::unix::io::FromRawFd;
fn foo() {
let mut p = Command::new("ls");
unsafe { p.stdout(Stdio::from_raw_fd(2)) };
let mut child = p.spawn().expect("spawn error");
child.wait().expect("wait error");
println!("process: {:?}", p);
}
fn main() {
foo();
foo();
}
代码似乎有些问题。也许它没有发布一些资源?答案 0 :(得分:2)
Stdio::from_raw_fd(2)
将文件描述符2的所有权赋予新构造的Stdio
对象。 Stdio
的析构函数将关闭文件描述符。 Stdio
的析构函数将在Command
被删除时运行,因为Command
拥有Stdio
。
当然,您在第二次拨打foo
时没有获得任何输出的原因是标准错误已经关闭!
简单的解决方案是复制文件描述符2并将副本传递给Stdio::from_raw_fd
。