3

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

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

4

3 回答 3

4

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

于 2011-04-26T04:43:26.883 回答
3

作为对Ignacio Vazquez-Abram 的回答的补充,我建议您模拟 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)

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

于 2011-04-29T04:25:27.593 回答
1

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

于 2011-04-26T06:13:02.387 回答