【问题标题】:How to bring a child process running in the background to the foreground如何将在后台运行的子进程带到前台
【发布时间】:2011-08-12 18:15:47
【问题描述】:

如果我使用 fork() 和 execv() 生成多个在后台运行的子进程,并且我想将其中一个带到前台,我该怎么做?

我正在尝试编写一个可以在前台或后台启动进程的 shell。

【问题讨论】:

    标签: c++ linux process fork execv


    【解决方案1】:

    “后台”和“前台”不是一般用于进程的术语,而是仅适用于可以按需等待作业的 shell。

    【讨论】:

    • +1 这是正确的。 “前台”进程是接收标准输入并写入标准输出/标准错误的进程。操作系统本身没有这个概念。
    • 接收标准输入。甚至后台进程也可以写入标准输出和标准错误。
    • 值得补充的是,如果原始海报意味着他们需要父母停止做任何事情直到特定的孩子完成,他们只需要waitpid(2)就可以了。
    • 答案很有趣,但对 OP 没有帮助。
    • @Matt:除非 OP 描述如何他们将进程置于后台,否则无法提供帮助。
    【解决方案2】:

    恭喜Ignacio Vazquez-Abram's answer,我建议你模拟一下shell前景/背景模型。

    据我所知,后台处理进程意味着暂停它。最简单的方法是通过SIGSTOP。当您将进程置于前台时,请发送SIGCONT。只要您当前只有一个“工作”在前台,它将是唯一一个对会话的tty 进行读写的工作。

    kill(child_pid, SIGSTOP);
    kill(child_pid, SIGCONT);
    

    您可能希望在 fork 之后和 execv 之前暂停每个进程,并为您的 shell 用户提供稍后将它们置于前台以保持不变性的选项。

    if (!fork()) { // we are the child
        raise(SIGSTOP); // suspend self
        execv(...); // run the command (after we've been resumed)
    

    以下是我找到的一些相关链接:

    【讨论】:

    • 我不认为在后台运行程序意味着暂停它。这意味着当程序运行时,父进程运行。
    • 程序(进程)没有前台或后台的概念。这是一个外壳概念。有关更多信息,请参阅 Ignacio Vazquez-Abrams 的回答。
    【解决方案3】:

    您可以使用 fg 将进程置于前台,使用 bg 将进程置于后台。您应该知道将其置于前台的进程的 pid。更多信息请参考 fg 和 bg 的 linux 手册

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2012-08-09
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多