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