如果我使用fork()和execv()来生成在后台运行的几个子进程,我想将其中一个带到前台,我该怎么做?
我正在尝试编写一个可以在前台或后台启动进程的shell。
答案 0 :(得分:4)
“背景”和“前景”不是通常用于流程的术语,而是仅适用于可以按需等待作业的shell。
答案 1 :(得分: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)
以下是我发现的一些相关链接:
答案 2 :(得分:1)
你可以使用fg将进程带到前台,然后使用bg将进程放到后台。你应该知道将它带到前台的过程的pid。请参阅fg和bg的linux手册以获取更多信息