[英]Sending a process to the background and returning control to my shell
我正在为我的CS类编写一个shell,项目的一部分涉及如果用户传入'&'字符,则在后台运行一个进程。
如果一个进程在前台运行,我简单execvp
过程,因为它是在前景它保持在该终端的控制。 但是,如果它是后台进程,我必须在开始执行进程后将控制权返回给我的主shell。 我知道系统调用tcsetpgrp(pid_t)
将进程作为参数传递给前台,但我不太明白如何使用它。
如果是后台进程,我应该在execvp
之后调用tcsetpgrp
吗? 如果是这样,我可以通过调用getpid
来获取shell的pid吗?
tcsetpgrp()
适用于进程组 ,而不适用于单个进程。 你想要做的是:
创建新管道时,调用setpgid()
将管道的所有成员放入新的进程组(管道中第一个进程的PID作为PGID)。 (管道是shell在看到像ls | grep foo | wc -l
这样的请求时启动的一系列进程 - 最简单的管道中只有一个进程)。 通常,在调用exec()
之前setpgid(0, 0)
您将从管道中的第一个进程调用setpgid(0, 0)
exec()
。
使用tcsetpgrp()
来管理前台中的哪个进程组。 如果将进程组从前台移动到后台,则可以将shell自己的进程组设置为前台进程组 - 您可以在shell中使用getpgid(0)
获取此进程组。
当shell在后台时,它应该使用阻塞的waitpid()
调用来等待子进程退出而不是显示提示。 一旦前台管道中的每个进程都退出,它应该将自己重新置于前台(并显示提示)。
当shell位于前台时,它应该使用WNOHANG
和WUNTRACED
标志调用waitpid()
以在显示提示之前检查子进程的状态 - 这将在它们停止或退出时通知您,并让您通知用户。
你应该看一下fork来创建子进程。 然后,在子exec
中使用exec
来运行所需的命令。
如果你的shell使用&
来启动一个进程,那么$!
shell变量将包含子进程的PID。 然后,您可以向该过程发送信号,或使用wait $!
等待它完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.