使用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
来自setpgrp
Darwin/MacOS(基于 BSD)的手册页:
如果调用进程还不是会话领导者,setpgrp() 将调用进程的进程组 ID 设置为调用进程的进程组 ID。 此操作创建的任何新会话都将没有控制终端。
这就是你的答案。