我有一个 Go 程序,它使用来自 shell 管道的“实时”输入,例如:
tail -f some/file | my-program
my-program是一个用rivo/tview. 我希望能够使用 Ctrl-C 关闭我的程序并让它也终止向tail -f它提供输入的程序。
目前我必须按两次Ctrl-C才能回到我的 shell 提示符。有什么方法可以通过按一次Ctrl-C 回到提示符?
根据@torek 对进度组的解释和观察unix.Getpgid(pid)调整了我的程序,我可以使用以下方法获取进度组 ID :
import (
"os"
"golang.org/x/sys/unix"
)
func main() {
// do stuff with piped input
pid := os.Getpid()
pgid, err := unix.Getpgid(pid)
if err != nil {
log.Fatalf("could not get process group id for pid: %v\n", pid)
}
processGroup, err := os.FindProcess(pgid)
if err != nil {
log.Fatalf("could not find process for pid: %v\n", pgid)
}
processGroup.Signal(os.Interrupt)
}
这从我原来的问题中提供了我想要的行为。
syscall由于发现警告,我选择不使用:
已弃用:此软件包已锁定。调用者应该使用 golang.org/x/sys 存储库中的相应包。这也是应该应用新系统或版本所需的更新的地方。有关更多信息,请参阅https://golang.org/s/go1.4-syscall。
我计划更新我的程序以使用本文中概述的策略来检测它是否被赋予了管道,因此当检测到管道时,我将在中断时执行上述进程组信号。
有什么问题吗?
桃花长相依
相关分类