从交互式go cli终止外壳管道

内裤

我有一个Go程序,它使用了来自外壳管道的“实时”输入,例如:

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

我计划更新程序,以使用本文概述策略来检测是否给了管道,因此,当检测到管道时,我将在中断上执行上述进程组信号。

有什么问题吗?

星期二

我们将假定使用一个类似Unix的系统,该shell可以理解并参与作业控制(并且它们现在都可以执行)。运行命令时,外壳程序会创建一个称为进程组或“ pgroup”的文件,以容纳组成该命令的每个进程如果该命令是管道(如前所述),则管道中的每个进程都将获得相同的pgroup-ID(请参阅参考资料setpgid)。

如果该命令在Forgeground中运行(不带&),则控制终端将分配此特定的pgid。按压信号生成密钥,如一个CTRL-CCTRL-\,发送相应的信号(SIGINTSIGQUIT在这些情况下)到PGROUP,使用内部killpg或等同物。这会将信号发送到pgroup的每个成员。

(对进程进行后台处理只是“咳嗽”,只需将控制tty上的pgid取回,然后重新启动管道中的进程即可。要做到这一点,并不是那么简单,如此处的“重新启动”所示。)

问题的可能根源在于,交互式程序会将控制终端置于cbreakraw模式,并禁用来自键盘按键的部分或全部信号,因此,例如,CTRL-C不再导致内核的tty模块在以下位置发送信号所有。相反,如果您看到应该引起挂起(CTRL-Z)或终止的键,则该程序必须自行执行挂起或终止。程序员有时会认为这只是暂停或终止而已,但是由于整个管道永远都没有问题信号,所以情况并非如此,除非整个Shell管道仅由交互式程序组成。

解决方法是让程序对控制终端进行任何必要的清理(临时或永久)后,将信号发送到其自己的pgroup。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过命名管道的交互式外壳

来自分类Dev

体面的交互式TCL外壳

来自分类Dev

Apache Kafka的交互式管理外壳

来自分类Dev

以编程方式启动交互式外壳

来自分类Dev

Apache Kafka的交互式管理外壳

来自分类Dev

体面的交互式TCL外壳

来自分类Dev

PHP交互式外壳程序启动

来自分类Dev

防止SIGQUIT终止交互式python

来自分类Dev

区分交互式登录和非交互式非登录外壳

来自分类Dev

在非交互式外壳中运行脚本?

来自分类Dev

获得非交互式外壳的“ top”输出

来自分类Dev

是否有可能存在非交互式的登录外壳?

来自分类Dev

交互式外壳是什么意思?

来自分类Dev

是否有非交互式登录外壳?

来自分类Dev

为命令创建交互式外壳

来自分类Dev

是否有可能是非交互式的登录外壳?

来自分类Dev

“每个交互式外壳”是什么意思?

来自分类Dev

node.js交互式外壳中的窗口对象

来自分类Dev

debian交互式外壳程序不调用.profile

来自分类Dev

在交互式外壳模式和非交互式外壳模式下运行ssh之间有区别吗?

来自分类Dev

如何区分管道和交互式标准输入

来自分类Dev

Powershell如何通过管道传递交互式命令

来自分类常见问题

登录外壳程序和交互式外壳程序有什么区别?

来自分类Dev

为什么默认情况下OSX登录外壳上有交互式外壳?

来自分类Dev

具有自动完成功能的自定义交互式外壳

来自分类Dev

cron作业是否运行非交互式,非登录外壳?

来自分类Dev

PHP交互式外壳,没有带回声的换行符

来自分类Dev

交互式外壳在孤立的流程组中应该做什么?

来自分类Dev

PERLLIB成功注入@INC数组,但不适用于非交互式外壳

Related 相关文章

热门标签

归档