如果我使用 fork() 和 execv() 来生成多个在后台运行的子进程,并且我想将其中一个带到前台,我该怎么做?
我正在尝试编写一个可以在前台或后台启动进程的 shell。
“后台”和“前台”不是一般用于进程的术语,而是仅适用于可以按需等待作业的外壳。
作为对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)
以下是我找到的一些相关链接:
您可以使用 fg 将进程置于前台,使用 bg 将进程置于后台。您应该知道将其置于前台的进程的 pid。有关更多信息,请参阅 fg 和 bg 的 linux 手册