繁体   English   中英

将进程发送到后台并将控制权返回给我的shell

[英]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()适用于进程组 ,而不适用于单个进程。 你想要做的是:

  1. 创建新管道时,调用setpgid()将管道的所有成员放入新的进程组(管道中第一个进程的PID作为PGID)。 (管道是shell在看到像ls | grep foo | wc -l这样的请求时启动的一系列进程 - 最简单的管道中只有一个进程)。 通常,在调用exec()之前setpgid(0, 0)您将从管道中的第一个进程调用setpgid(0, 0) exec()

  2. 使用tcsetpgrp()来管理前台中的哪个进程组。 如果将进程组从前台移动到后台,则可以将shell自己的进程组设置为前台进程组 - 您可以在shell中使用getpgid(0)获取此进程组。

  3. 当shell在后台时,它应该使用阻塞的waitpid()调用来等待子进程退出而不是显示提示。 一旦前台管道中的每个进程都退出,它应该将自己重新置于前台(并显示提示)。

  4. 当shell位于前台时,它应该使用WNOHANGWUNTRACED标志调用waitpid()以在显示提示之前检查子进程的状态 - 这将在它们停止或退出时通知您,并让您通知用户。

你应该看一下fork来创建子进程。 然后,在子exec中使用exec来运行所需的命令。

如果你的shell使用&来启动一个进程,那么$! shell变量将包含子进程的PID。 然后,您可以向该过程发送信号,或使用wait $! 等待它完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM