gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:16:23 27 4
gpt4 key购买 nike

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();
}
  1. 这里的不安全 代码似乎有问题。也许它没有释放一些资源?
  2. 有没有办法在不使用不安全代码的情况下执行 stdout -> stderr 重定向?

最佳答案

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

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

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

关于rust - 第二次将 stdout 重定向到 stderr 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43018956/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com