将stdout重定向到stderr第二次时崩溃

时间:2017-03-25 16:32:49

标签: rust stdout stderr unsafe

#vim80/defaults.vim:99-102 autocmd BufReadPost * \ if line("'\"") >= 1 && line("'\"") <= line("$") | \ exe "normal! g`\"" | \ endif 的第二次运行将崩溃而不会显示错误消息。当我删除此foo()行时,它可以正常工作。

unsafe
  1. 这里的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(); } 代码似乎有些问题。也许它没有发布一些资源?
  2. 有没有办法做stdout - &gt; stderr重定向而不使用不安全的代码?

1 个答案:

答案 0 :(得分:2)

Stdio::from_raw_fd(2)将文件描述符2的所有权赋予新构造的Stdio对象。 Stdio的析构函数将关闭文件描述符。 Stdio的析构函数将在Command被删除时运行,因为Command拥有Stdio

当然,您在第二次拨打foo时没有获得任何输出的原因是标准错误已经关闭!

简单的解决方案是复制文件描述符2并将副本传递给Stdio::from_raw_fd