2

从我的代码运行外部程序时,我有以下三个选项:

  1. 之后什么都不做fork()。外部程序将在其父进程组中。
  2. 调用setpgid(0, 0)或类似的,因此外部程序将获得自己的进程组。
  3. Call setsid(),它还将外部程序与其父级的控制 tty 分开。

以上哪些行为在哪些情况下是正确的?

例如,我看到一个使用 vim 和 gnome-open 的有趣行为:

  1. 我运行:!gnome-open somefile.pdf,它启动 PDF 查看器并立即返回。
  2. 然后我运行,例如,,:!cat当 cat 运行时,发送一个SIGQUITusing CTRL-\

PDF 查看器崩溃。发生这种情况是因为 vim 和 gnome-open 似乎都在自己的进程组中生成了它们的子进程。

被称为 bug 可能太晦涩难懂,但我仍然想知道是谁的错:vim 或 gnome-open 是否有任何理由setpgid在分叉后不调用,就像 shell 会做的那样?gnome-open改为调用setsid将 X 应用程序与其启动的终端分开是否更有意义?(我觉得奇怪的是 GLib 没有提供标准和跨平台的方式来做这些事情。)

4

0 回答 0