【问题标题】:How do you write to a pty master Rust你如何写信给 pty master Rust
【发布时间】:2020-02-23 22:05:10
【问题描述】:

我已经创建了一个简单的 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());
}

【问题讨论】:

    标签: unix rust libc tty pty


    【解决方案1】:

    这是意料之中的。 std::process::Child::stdin 和朋友没有为原始文件句柄设置(因为 Rust 不知道它们是什么,构建器没有你的 pty 的 master 结尾)。

    您可以自己为 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”。

    (Permalink to the playground)

    【讨论】:

    • 所以如果我理解正确,stdout、stdin 和 stderr 注册为 none 的原因是因为 std::process::Child 类型不理解我传递给 .stdin( ) 和其他方法?鉴于这种情况,我最好从从 fd 创建一个文件并使用它来操作?
    • 好吧,在您这边,您应该使用主服务器,而不是从服务器。 Child 不知道主机,因为您只将原始句柄传递给从机(这是生成的进程所需要的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2019-02-19
    • 2015-02-25
    • 2021-03-18
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多