从我的代码运行外部程序时,我有以下三个选项:
- 之后什么都不做
fork()
。外部程序将在其父进程组中。 - 调用
setpgid(0, 0)
或类似的,因此外部程序将获得自己的进程组。 - Call
setsid()
,它还将外部程序与其父级的控制 tty 分开。
以上哪些行为在哪些情况下是正确的?
例如,我看到一个使用 vim 和 gnome-open 的有趣行为:
- 我运行
:!gnome-open somefile.pdf
,它启动 PDF 查看器并立即返回。 - 然后我运行,例如,,
:!cat
当 cat 运行时,发送一个SIGQUIT
usingCTRL-\
。
PDF 查看器崩溃。发生这种情况是因为 vim 和 gnome-open 似乎都在自己的进程组中生成了它们的子进程。
被称为 bug 可能太晦涩难懂,但我仍然想知道是谁的错:vim 或 gnome-open 是否有任何理由setpgid
在分叉后不调用,就像 shell 会做的那样?gnome-open
改为调用setsid
将 X 应用程序与其启动的终端分开是否更有意义?(我觉得奇怪的是 GLib 没有提供标准和跨平台的方式来做这些事情。)