gpt4 book ai didi

shell - 如何在同时传送stdio的同时模拟TTY?

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

我正在寻找一种跨平台的解决方案,用于在Rust中模拟TTY(PTY?),同时还要传递stdio。
前端基于Web技术,其中显示了一个交互式终端。用户可以运行命令,所有输入都将发送到Rust后端,在该后端执行命令。 Std {in,out,err}会向后发送,以提供交互式体验。
这是一个简化的示例(仅管道标准输出):

let mut child = Command::new(command)
.stdout(Stdio::piped())
.spawn()
.expect("Command failed to start");

loop {
let read = reader.read(&mut chunk);

if let Ok(len) = read {
if len == 0 {
break;
}
let chunk = &chunk[..len];

send_chunk(chunk); // send chunk to frontend
} else {
eprintln!("Err: {}", read.unwrap_err());
}
}
当前,运行命令 tty会输出: not a tty,但理想情况下,它应该输出文件名(例如 /dev/ttys002)。并且诸如 atty之类的程序应返回 true
仅使用stdio继承的作品在终端中运行后端,但随后我无法将stdio发送回前端。

最佳答案

定义“跨平台”。就PTY而言,这些是内核支持的伪设备,包括ioctl和所有内容。实际上,终端仿真器将要做的许多事情就是实现这些ioctl的接收端。
只要您使用的是具有BSD API(包括Linux)的机器,最佳的操作方法就是openpty并随之滚动。如果要移植到不支持BSD PTY的系统,则必须在子进程中挂接tty函数(通过预加载帮助程序库)。

关于shell - 如何在同时传送stdio的同时模拟TTY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64479463/

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