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

2024-01-09

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

如果一个进程在前台运行,我只需execvp该进程并且它仍然控制着终端,因为它位于前台。但是,如果它是后台进程,我必须在开始执行进程后将控制权返回到主 shell。据我了解,系统调用tcsetpgrp(pid_t)将作为参数传入的进程放在前台,但我不太明白如何使用它。

我应该打电话吗tcsetpgrp after execvp如果它是后台进程?如果是这样,我可以通过调用来获取我的shell的pid吗getpid?


tcsetpgrp()致力于进程组,而不是单个进程。你想做的是这样的:

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将进程发送到后台并将控制权返回到我的 shell 的相关文章

随机推荐

  • 示例 ATL 对话框窗口

    谁能帮我找到一个最新的 有效的 ATL 项目 其中有一个主窗口和一些组件 看在上帝的份上 请不要告诉我使用 WTL Qt 或其他 我需要ATL 没有关于它的最新项目 我只需要一个主窗口 仅此而已 剩下的我能弄清楚 提前致谢 好的 看在上帝的
  • Polymer 元素和 AngularJS 指令有什么区别?

    关于聚合物入门 http www polymer project org docs start usingelements html页面中 我们看到了聚合物的实际应用示例
  • 如何使 Ionic 列表中的项目更小(高度更低)?

    标准中的项目ion list of ion items对于我的应用程序来说太大了 如何使它们在垂直方向上更小 更短 似乎试图修改的边距属性 item类产生的结果完全是无稽之谈 这不是答案 修改相同的填充属性似乎没有做任何事情 也不是答案 您
  • epoll_wait 由于 EINTR 失败,如何解决?

    我的 epoll wait 由于 EINTR 失败 我的 gdb 跟踪显示了这一点 enter code here 221 in nptl sysdeps pthread createthread c gdb 224 in nptl sys
  • org.hibernate.QueryParameterException:无法找到命名参数

    我的项目设置是 Spring MVC Hibernate 3 2 x MySQL DB 出现以下错误 org hibernate QueryParameterException 无法找到命名参数电子邮件 方法 1 Override publ
  • 通过 IntelliJ IDEA 13 部署的 Tomcat war 返回错误

    我在 IntelliJ 中部署第一个 WAR 文件时遇到以下错误 据推测 这是一个本地问题 因为这只是我们部署来测试我们的设置的 WAR 文件 所有 80 个 Maven 测试都通过了 但是当我浏览到 Web 应用程序时 出现以下错误 ja
  • 在 Linux 中获取指向结构设备的指针哪种更干净?

    我需要获得一个指向在linux 中注册的特定设备的指针 简而言之 该设备代表了mii bus目的 问题是这个设备似乎不属于总线 它的dev gt bus is NULL 所以我不能使用这个函数bus for each dev 然而 该设备是
  • PHP中从JSON中随机选择项目

    我有一个像这样的 JSON 字符串 Format I25 Content 172284201241 Format I25 Content 40124139 Format I25 Content 20197086185689 Format I
  • 如何在 mvc 站点的类项目部分中初始化 Ninject

    我在一个小项目中使用了 Ninject 但现在正在将一个较大的 Web 应用程序转换为 MVC 并且需要使用 Ninject 的帮助 在新的解决方案中 我拥有 mvc 站点 并将一些功能拆分为单独的类项目 例如我的 ReportGenera
  • 无法解析主机名 git:提供节点名或服务名,或未知

    我尝试做git pull rebase我收到以下错误 ssh Could not resolve hostname git nodename nor servname provided or not known fatal Could no
  • 为什么部分与页面高度不匹配?

    我正在编写一个报告 该报告需要附加到另一个报告以生成更大的报告 因此它只有标题 页脚和摘要部分 问题是我遇到编译错误 但我不知道原因 这是我的jrxml文件 包含的部分 为简洁起见省略
  • stopPropgation 是否会阻止事件在捕获阶段传播?

    我在看http www quirksmode org js events order html http www quirksmode org js events order html这部分含糊不清 在 Microsoft 模型中 您必须设
  • python中的打印函数对可以打印的字符串长度有限制吗?

    我正在尝试打印一个大字符串 它的大小为 100 Mb 并且需要一次完成 看起来它正在被截断 虽然这不能回答您的问题 但用于移动大量数据print可能是一个坏主意 print is meant用于简短的信息打印输出 它提供了您在移动大数据时通
  • Kotlin / Android Studio - 如何将变量从覆盖 fun 传递到应用程序的其余部分?

    我环顾四周 没有找到解决我的问题的好答案 在我的应用程序上 我有一个计时器 该计时器在单击后停止 我想根据剩余时间计算分数 我可以使用 millisUntilFinished 来计算分数 但我无法在我的应用程序中重用分数变量 您能帮我找到正
  • 限时试用和 Windows 认证

    如果您想对某个应用程序实施限时试用 您可能需要留下一些标志 注册表项 文件等 这样程序就不能被重新安装 是否有任何方案可以让您在完成此操作的同时仍然通过各种 Windows 认证计划 一般来说 申请必须正确 完整 从机器上卸载 这 包括删除
  • ffmpeg - 生成 moov 原子

    我目前正在使用blackmagic的prorecorder录制视频 我使用 ffmpeg 将视频即时转码为 mp4 视频容器 持续时间未知 因为我正在对 prorecorder 输出到命名管道的 ts 进行转码 我的目标是尝试使用浏览器播放
  • 如何在spark中合并两个预排序的rdd?

    我有两个大型 csv 文件 按其中一列进行了预排序 有没有办法利用它们已经排序的事实来更快地获得新的排序 RDD 而无需再次完全排序 简短的回答 不 在使用 Apache Spark 提供的排序工具时 无法利用两个输入 RDD 已经排序的事
  • jqgrid加载大数据集而不分页

    我想知道是否有更好的方法从服务器加载大型 Json 数据集 我使用 jqgrid 作为 loadonce true 我需要一次加载大约 1500 条记录 而且我不使用分页选项 有没有更好的方法来实现这一目标 先感谢您 这是我的网格代码 fu
  • 谷歌表格中填充谷歌表格的平均持续时间

    我有一个从谷歌表单自动填充的谷歌工作表 有一个包含持续时间的列 当我尝试平均这些持续时间时 我得到除以零的错误 我尝试更改单元格格式 但没有任何效果 事实上 无论我选择什么格式 它都不会改变 我认为格式是根据填充工作表的表单来锁定的 对于获
  • 将进程发送到后台并将控制权返回到我的 shell

    我正在为我的 CS 类编写一个 shell 并且该项目的一部分涉及如果用户传入 字符 则在后台运行一个进程 如果一个进程在前台运行 我只需execvp该进程并且它仍然控制着终端 因为它位于前台 但是 如果它是后台进程 我必须在开始执行进程后