在 c++ 中,不等待并不意味着在后台运行?

In c++, not waiting doesn't mean running in the background?

本文关键字:后台 运行 意味着 等待 c++      更新时间:2023-10-16

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

然而,在Linux中,如果我在后台像这样启动vi: vi &,那么vi不会显示。在我的程序中,即使我不等待它终止,vi仍然会弹出。

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

另外,我注意到在Linux中,如果我输入fg将vi带到前台,那么vi将出现。我如何在c++中做到这一点?

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

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

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