1

在我的 c++ 程序中,我尝试通过不等待它们在后台运行程序。

但是在 Linux 中,如果我像这样在后台启动 vi: vi &,则 vi 不会出现。在我的程序中,即使我不等待它终止,vi 仍然会弹出。

那么这是否意味着我并没有真正在后台运行它?如何解决这个问题?

另外,我注意到在 Linux 中,如果我键入fg将 vi 带入前台,则会出现 vi。我怎样才能在 C++ 中做到这一点?

4

1 回答 1

5

这里发生的事情相当复杂(有关您可能需要的更多信息,请参阅 glibc 的有关作业控制的手册部分),但简短的版本是:只有前台进程组可以访问终端。如果任何其他进程^Z尝试访问终端,它都会被内核自动编辑。

当您从 C 中派生一个进程时,如果父进程在前台进程组中,则子进程也被视为在前台进程组中,除非父进程或子进程更改了这一点。当您这样做vi &时,shell(记住,它只是另一个 C 程序)vi退出前台进程组。但你没有这样做,所以vi立即运行。

现在,你想从你的 C 程序中派生一个进程,并让它被视为&从 shell 中运行的一样。你只能做其中的一部分。你可以把它放到一个非前台进程组中——参见 glibc 手册中的说明;正如我所说,它很复杂——但你不能将它添加到 shell 的作业控制命令知道的进程组列表中。该列表是外壳内部的状态,无法从另一个进程中获取它。

于 2011-05-04T03:38:21.550 回答