我正在为我的 CS 类编写一个 shell,并且该项目的一部分涉及如果用户传入“&”字符,则在后台运行一个进程。
如果一个进程在前台运行,我只需execvp
该进程并且它仍然控制着终端,因为它位于前台。但是,如果它是后台进程,我必须在开始执行进程后将控制权返回到主 shell。据我了解,系统调用tcsetpgrp(pid_t)
将作为参数传入的进程放在前台,但我不太明白如何使用它。
我应该打电话吗tcsetpgrp
after execvp
如果它是后台进程?如果是这样,我可以通过调用来获取我的shell的pid吗getpid
?
tcsetpgrp()
致力于进程组,而不是单个进程。你想做的是这样的:
当你创建一个新的管道时,调用setpgid()
将管道中的所有成员放入一个新的进程组中(以管道中第一个进程的PID作为PGID)。 (管道是 shell 看到类似请求时启动的一系列进程ls | grep foo | wc -l
- 最简单的管道只有一个进程)。通常你会打电话setpgid(0, 0)
从管道中的第一个进程开始,在调用之前exec()
.
Use tcsetpgrp()
管理哪个进程组位于前台。如果将进程组从前台移动到后台,则可以将 shell 自己的进程组设置为前台进程组 - 您可以使用getpgid(0)
在壳里。
当 shell 处于后台时,应该使用阻塞waitpid()
调用以等待子进程退出而不是显示提示。一旦前台管道中的每个进程退出,它应该再次将自己放回前台(并显示提示)。
当 shell 位于前台时,它应该调用waitpid()
与WNOHANG
and WUNTRACED
在显示提示之前检查子进程状态的标志 - 这将通知您子进程何时停止或退出,并让您通知用户。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)