gpt4 book ai didi

macos - 为什么这个 exec.Command 到另一个打开的 tty 不能正常工作

转载 作者:数据小太阳 更新时间:2023-10-29 03:26:43 26 4
gpt4 key购买 nike

谁能帮我弄清楚我在这里做错了什么。

我正在尝试执行在不同 tty 中运行的命令(在本例中打开 vim),在本例中为/dev/ttys001,它在我终端的另一个选项卡中打开。

运行下面的代码确实会在/dev/ttys001 的窗口中呈现 vim,但是,实际上从那个窗口输入到 stdin 并没有正确注册。

非常感谢任何建议!

package main

import (
"log"
"os"
"os/exec"
)

func main() {
tty, err := os.OpenFile("/dev/ttys001", os.O_RDWR, os.ModePerm)
if err != nil {
log.Fatalln(err)
}
defer tty.Close()

c := exec.Command("vim")
c.Stdin = tty
c.Stdout = tty
c.Stderr = tty
if err := c.Run(); err != nil {
log.Fatalln(err)
}
}

我还尝试使用以下代码设置命令的 SysProcAttr 字段,但收到错误:fork/exec/usr/local/bin/vim: inappropriate ioctl for device。

procAttr := &syscall.SysProcAttr{
Setpgid: true,
Ctty: int(tty.Fd()),
Foreground: true,
}
c.SysProcAttr = procAttr

最佳答案

对于任何感兴趣的人,我想出了一个解决方案,但我最终不得不使用系统调用而不是 os/exec 包的函数。

package main

import (
"log"
"os"
"syscall"
"unsafe"
)

var tty = "/dev/ttys001"
var cmd = "vim\n"

func main() {
ttyFile, err := os.Open(tty)
if err != nil {
log.Fatalln(err)
}
defer ttyFile.Close()

cbs, err := syscall.ByteSliceFromString(cmd)
if err != nil {
log.Fatalln(err)
}

var eno syscall.Errno
for _, c := range cbs {
_, _, eno = syscall.Syscall(syscall.SYS_IOCTL,
ttyFile.Fd(),
syscall.TIOCSTI,
uintptr(unsafe.Pointer(&c)),
)
if eno != 0 {
log.Fatalln(eno)
}
}
}

关于macos - 为什么这个 exec.Command 到另一个打开的 tty 不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39352292/

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