gpt4 book ai didi

rust - 如何实现将子进程的标准输出重定向到文件?

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

我正在用 Rust 编写的 shell 中实现 I/O 重定向。我通过使用带有原始文件描述符的不安全代码和来自 libc crate 的 pipe() 成功地在两个子进程之间建立了管道。

当我尝试将最后一个子进程的 stdout 重定向到我有权访问的文件时,它失败了:

extern crate libc;
use std::process::{Command, Stdio};
use std::os::unix::io::{FromRawFd, IntoRawFd};
use std::fs::File;
use self::libc::c_int;

fn main() {
let mut fds = [-1 as c_int, -1 as c_int];
let fd1 = File::open("test1").unwrap().into_raw_fd();
let fd2 = File::open("test2").unwrap().into_raw_fd();
let fd3 = File::open("test3").unwrap().into_raw_fd();
println!("{:?}, {:?}, {:?}", fd1, fd2, fd3);
unsafe {
libc::pipe(&mut fds[0] as *mut c_int);
let cmd1 = Command::new("ls")
.arg("/")
.stdout(Stdio::from_raw_fd(fds[1]))
.spawn()
.unwrap();
let mut cmd2 = Command::new("grep")
.arg("etc")
.stdin(Stdio::from_raw_fd(fds[0]))
.stdout(Stdio::from_raw_fd(fd1))
.spawn()
.unwrap();
let _result = cmd2.wait().unwrap();
}
}

以上片段的结果:

3, 4, 5
grep: write error: Bad file descriptor

似乎文件描述符没有正确返回,但是如果没有名为 test1、test2 和 test3 的文件,File::open(_).unwrap() 应该 panic 而不是假装打开了一个文件。

如果删除对文件的重定向,即仅使用管道,则代码可以正常工作。

最佳答案

File::open 的文档状态(强调我的):

Attempts to open a file in read-only mode.

切换到 File::create似乎正在创建文件,并且“etc”已写入其中。


此外,您应该:

  1. 不打开 2 个额外的文件 - 没有任何东西会关闭这些文件描述符,因此您会发生资源泄漏。
  2. 检查pipe的返回值来处理错误。
  3. 查看 nix crate .
extern crate libc;
extern crate nix;

use std::process::{Command, Stdio};
use std::os::unix::io::{FromRawFd, IntoRawFd};
use std::fs::File;

use nix::unistd::pipe;

fn main() {
let fds = pipe().unwrap();
let fd1 = File::create("test1").unwrap().into_raw_fd();

let (pipe_in, pipe_out, file_out) = unsafe {
(Stdio::from_raw_fd(fds.0),
Stdio::from_raw_fd(fds.1),
Stdio::from_raw_fd(fd1))
};

Command::new("ls")
.arg("/")
.stdout(pipe_out)
.spawn()
.unwrap();

let mut cmd2 = Command::new("grep")
.arg("etc")
.stdin(pipe_in)
.stdout(file_out)
.spawn()
.unwrap();

cmd2.wait().unwrap();
}

关于rust - 如何实现将子进程的标准输出重定向到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42726095/

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