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

标签 c linux shell background-process process-group

我正在为我的 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)

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

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

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

关于c - 将进程发送到后台并将控制权返回到我的 shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10779020/

相关文章:

c - 如果在多维数组中使用函数,则缩短

c - 编译背后的主要步骤是什么?

c - 在 shell 中运行 cat 命令时文件描述符错误

linux - 如何使用 perl 脚本将单个日志从 linux 服务器读取到另一个日志文件

linux - Bash:如何在后台 while 循环中检索变量值

c - Y86 处理器 C 语言帮助!卡在loader.c文件上

c - 在 GPU 上使用随机数

python - 从python执行awk命令

bash - SSH Heredoc在另一台服务器上运行Perl脚本找不到正确的路径

linux - 循环脚本,重定向到文件