2011-04-26 104 views
2

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

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

回答

4

“背景”和“前景”不是一般用于过程的术语,而是仅适用于可按需等待工作的壳。

+0

+1这是正确的。 “前台”进程是接收标准输入并写入标准输出/标准错误的进程。操作系统本身没有这个概念。 – Borealid 2011-04-26 04:46:29

+1

收到stdin。即使后台进程可以写入标准输出和标准错误。 – 2011-04-26 04:48:35

+0

值得一提的是,如果原始海报意味着他们需要父母在特定孩子结束之前停止做任何事情,他们只需要'waitpid(2)'就可以了。 – 2011-04-26 06:28:54

1

您可以使用fg将过程带到前台,并使bg将过程置于背景。你应该知道这个过程的PID,以便将它带到前台。参考fg和bg的linux手册了解更多信息

4

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) 

这里是我发现一些相关链接:

+0

我不认为在后台运行程序意味着挂起它。这意味着程序运行父级运行时。 – 2011-04-29 21:02:55

+0

当涉及到程序(过程)时,没有前景或背景的概念。这是一个外壳的概念。有关这方面的更多信息,请参阅Ignacio Vazquez-Abrams的答案。 – 2011-04-30 12:08:44