setpgrp 导致 tty 消失

setpgrp 导致 tty 消失

使用setpgrp vi(和其他 tty 程序)时的工作方式与setpgrp不使用时完全不同。例子:

perl -MIPC::Open3 -e '$pid= open3("<&STDIN", ">&STDOUT", ">&STDERR", qw(perl -e),q(exec qw(bash -c),qq(vi foo))); wait'

这很好用并且可以调用vi foo。但添加setpgrp

perl -MIPC::Open3 -e '$pid= open3("<&STDIN", ">&STDOUT", ">&STDERR", qw(perl -e),q(setpgrp;exec qw(bash -c),qq(vi foo))); wait'

然后它就不太有效了。

在 GNU/Linux (Mint)、FreeBSD、OpenBSD、Solaris、HPUX、AIX、Dragonfly 上进行了测试。所有人都表现出类似的行为。

为什么?我可以以某种方式创建一个进程组并仍然生成 tty 工具吗vi

背景

上面是 GNU Parallel 可能扩展的一部分,它将允许杀死进程组而不是进程,因此是整个程序的一个小角落。因此, “跑”的答案vi foo并不是一个有用的答案。

答案1

来自setpgrpDarwin/MacOS(基于 BSD)的手册页:

如果调用进程还不是会话领导者,setpgrp() 将调用进程的进程组 ID 设置为调用进程的进程组 ID。 此操作创建的任何新会话都将没有控制终端。

这就是你的答案。

相关内容