你如何写信给 pty master Rust
How do you write to a pty master Rust
我已经创建了一个简单的 pty 设置,但是我不确定创建后如何实际写入主端或从端。我也不确定我的设置是否正确,因为经检查,pty的子进程的Stdin、Stdout和Stderr都是None,而不是被设置为slave文件描述符。谁能澄清这是否正确,如果不正确,您对如何解决它有什么建议吗?
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
和朋友没有设置原始文件句柄(因为 Rust 不知道它们是什么,构建器没有你的 pty 的 master
结尾)。
您可以自己为大师构建您的生锈文件句柄:
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”。
我已经创建了一个简单的 pty 设置,但是我不确定创建后如何实际写入主端或从端。我也不确定我的设置是否正确,因为经检查,pty的子进程的Stdin、Stdout和Stderr都是None,而不是被设置为slave文件描述符。谁能澄清这是否正确,如果不正确,您对如何解决它有什么建议吗?
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
和朋友没有设置原始文件句柄(因为 Rust 不知道它们是什么,构建器没有你的 pty 的 master
结尾)。
您可以自己为大师构建您的生锈文件句柄:
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”。