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

use*_*913 5 c linux shell background-process process-group

我正在为我的CS类编写一个shell,项目的一部分涉及如果用户传入'&'字符,则在后台运行一个进程.

如果进程在前台运行,我只是execvp进程,它仍然在终端的控制之下,因为它在前台.但是,如果它是后台进程,我必须在开始执行进程后将控制权返回给我的主shell.我知道系统调用tcsetpgrp(pid_t)将进程作为参数传递给前台,但我不太明白如何使用它.

我应该叫tcsetpgrpexecvp,如果它是一个后台进程?如果是这样,我可以通过电话获取我的shell的pid getpid吗?

caf*_*caf 9

tcsetpgrp()适用于流程组,而不是单个流程.你想要做的是:

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

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

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

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


Die*_*ano -2

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