【发布时间】:2011-08-12 18:15:47
【问题描述】:
如果我使用 fork() 和 execv() 生成多个在后台运行的子进程,并且我想将其中一个带到前台,我该怎么做?
我正在尝试编写一个可以在前台或后台启动进程的 shell。
【问题讨论】:
标签: c++ linux process fork execv
如果我使用 fork() 和 execv() 生成多个在后台运行的子进程,并且我想将其中一个带到前台,我该怎么做?
我正在尝试编写一个可以在前台或后台启动进程的 shell。
【问题讨论】:
标签: c++ linux process fork execv
“后台”和“前台”不是一般用于进程的术语,而是仅适用于可以按需等待作业的 shell。
【讨论】:
waitpid(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)
以下是我找到的一些相关链接:
【讨论】:
您可以使用 fg 将进程置于前台,使用 bg 将进程置于后台。您应该知道将其置于前台的进程的 pid。更多信息请参考 fg 和 bg 的 linux 手册
【讨论】: