gpt4 book ai didi

go - 从伪终端获取先前的输入

转载 作者:行者123 更新时间:2023-12-01 22:16:43 25 4
gpt4 key购买 nike

我有一个使用 https://github.com/creack/pty 的程序创建伪终端。它是如何工作的,我给出了一个命令 - 在这种情况下是 bash -i - 它创建一个文件对象,您可以在其中读取和写入,它将作为 stdin 工作和 stdout ,我不断地读取文件并将数据发送给客户端。这工作正常,但是当另一个客户端连接时,它只会在她连接后接收数据,这是不可取的。
正常的客户行为:

computer:~$ 
computer:~$
computer:~$
computer:~$
computer:~$ echo "a"
a
computer:~$
第二个客户端在客户端 1 键入 c 后连接:
ho "a"
a
computer:~$
如您所见,这是有问题的,因为客户端 2 将截断输入,所需的行为是发送所有历史记录或缓存状态。
我尝试使用 file.ReadAt(b, 0) 读取文件它从偏移量 0 开始读取文件并将结果存储在 b 中但我得到 ENXIO: 6 - No such device or address我认为发生这种情况是因为该文件不是真正的文件。我目前正在做的是将所有输出数据存储到缓冲区中,当新客户端连接时,我发送存储的缓冲区,但这不是一个完整的解决方案,因为如果客户端使用 clear或者如果它使用了像 vi 这样与终端混淆的命令或 nano缓冲区不适应它只存储输出。
我正在使用 GO,但我认为这个问题与特定语言没有太大关系,所以如果你有 C 或其他语言的答案,我可以看到它并尝试在 GO 中找到等价物。无论如何,这是我正在使用的 GO 代码。
初始化:
c := exec.Command("bash", "-i")

// Start the command with a pty.
ptmx, err := pty.Start(c) // ptmx is of type *os.File
阅读:
// this gets called in a while true loop
func (t *Terminal) Read(b []byte) (int, error) {
n, e := t.ptmx.Read(b)
for _, byt := range b {
t.buffer.Insert(byt)
}
return n, e
}

最佳答案

抵消不会帮助你。问题是 pty 是一个没有内存的类似 channel 的设备:一旦数据流过 pty,从一端流到另一端,并被读取器消费,这些数据就消失了。操作系统的查找偏移量无关紧要。

如果你想维护所有交换数据的日志,你必须自己做。

关于go - 从伪终端获取先前的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59512763/

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