gpt4 book ai didi

unix - 您如何写给pty大师Rust

转载 作者:行者123 更新时间:2023-12-04 11:12:00 25 4
gpt4 key购买 nike

我已经创建了一个简单的pty设置,但是我不确定一旦创建后如何实际写入主端或从端。我也不确定我的设置是否正确,因为在检查时,pty的子进程的Stdin,Stdout和Stderr全部为None,而不是被设置为从属文件描述符。任何人都可以澄清这是否正确,如果不正确,您对如何解决它有任何建议吗?

use libc::{self};
use nix::pty::openpty;
use std::os::unix::io::FromRawFd;
use std::process::{Child, Command, Stdio};

#[derive(Debug)]
pub struct Pty {
process: Child,
fd: i32,
}

fn create_pty(process: &str) -> Pty {
let ends = openpty(None, None).expect("openpty failed");
let master = ends.master;
let slave = ends.slave;

let mut builder = Command::new(process);
builder.stdin(unsafe { Stdio::from_raw_fd(slave) });
builder.stdout(unsafe { Stdio::from_raw_fd(slave) });
builder.stderr(unsafe { Stdio::from_raw_fd(slave) });

match builder.spawn() {
Ok(process) => {
let pty = Pty {
process,
fd: master,
};

pty
}
Err(e) => {
panic!("Failed to create pty: {}", e);
}
}
}

fn main() {
let shell = "/bin/bash";

let pty = create_pty(shell);
println!("{:?}", pty);

println!("{}", pty.process.id());
}

最佳答案

这是预期的。没有为原始文件句柄设置std::process::Child::stdin和friends(因为Rust不知道它们是什么,所以构建器没有pty的master结尾)。

您可以自己为母版构建使用rust 的文件句柄:

fn main() {
let shell = "/bin/bash";

let pty = create_pty(shell);
println!("{:?}", pty);

let mut output = unsafe { File::from_raw_fd(pty.fd) };
write!(output, "touch /tmp/itworks\n");
output.flush();

std::thread::sleep_ms(1000);

println!("{}", pty.process.id());
}

您会看到它确实创建了一个文件“/tmp/itworks”。

(Permalink to the playground)

关于unix - 您如何写给pty大师Rust,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60367318/

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