【问题标题】:In c++, not waiting doesn't mean running in the background?在 C++ 中,不等待并不意味着在后台运行?
【发布时间】:2023-07-26 19:00:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你应该提供代码来展示你如何在后台启动一个程序
  • 一般来说,启动一个程序而不等待它意味着你的程序和新程序同时运行。但这并不一定意味着新程序在后台运行。
  • 运行后台是OS概念,与c++无关

标签: c++ process background foreground


【解决方案1】:

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

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

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

【讨论】:

    最近更新 更多