gpt4 book ai didi

rust - 在 Rust 中生成进程时重定向 stdio 的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-29 08:00:43 30 4
gpt4 key购买 nike

我看到了两种方法 (Rust v0.9)。对于下面的示例,假设我想将 STDOUT 重定向到某个文件。

首先是获取文件的文件描述符,然后将其传递给 std::run::ProcessOptions 结构。下面是 std::run::process_status 是如何做到的:

let mut opt_prog = Process::new(prog, args, ProcessOptions {
env: None,
dir: None,
in_fd: Some(unsafe { libc::dup(libc::STDIN_FILENO) }),
out_fd: Some(unsafe { libc::dup(libc::STDOUT_FILENO) }),
err_fd: Some(unsafe { libc::dup(libc::STDERR_FILENO) })
});

它获取 STDIN、STDOUT 和 STDERR 的常用文件描述符并设置它们。 但是我如何获取我在 Rust 中打开的某个任意文件的文件描述符?我还没有找到这样做的方法。


第二种选择是通过 ProcessOptions::new() 使用默认的 ProcessOptions,它打开一个到 stdin、stdout 和 stderr 的管道并让你获取它们,就像这样:

let pgm = "ls";
let args = ~[~"-lh"];

match Process::new(pgm, args, ProcessOptions::new()) {
None => println("fubar"),
Some(mut p) => {
{
let process = &mut p;
let rdr = process.output(); // grab STDOUT output
let out = rdr.read_to_str();
// write output to your file of choice here
}
p.close_input();
p.close_outputs();
p.finish();
}
}

我更喜欢第一种方式,但我怀疑第二种方式是惯用的方式。

我不喜欢第二个选项的地方是,如果我只想重定向 STDOUT 而不是其他选项怎么办?我现在必须调用 process.error() 并将其写回 STDERR,这看起来很愚蠢。我还必须为 STDIN 做类似的事情,因为它也被包裹在管道中。

关于最佳方法的想法?

最佳答案

使用 std::os::unix::AsRawFd特征,它扩展了平台无关的std::io::fs::Fileas_raw_fd方法返回一个文件描述符。

使用这个和其他特定于 Unix 的扩展的一种便捷方式是导入 std::os::unix::prelude模块。特别是,我最初为回答问题而写的示例实际上与 example 相同。现在在文档中:

#![feature(globs)]

use std::io::fs::File;
use std::os::unix::prelude::*;

fn main() {
let p = Path::new("/etc/passwd");
let f = File::open(&p).unwrap();
let fd = f.as_raw_fd();
println!("{} fd: {}", p.as_str().unwrap(), fd);
}

关于rust - 在 Rust 中生成进程时重定向 stdio 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21569315/

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