加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 21:53:47 所属栏目:安全 来源:网络整理
导读:我正在为我的CS类编写一个 shell,项目的一部分涉及在后台运行一个进程,如果’’字符由用户传入. 如果一个进程在前台运行,我只是执行该进程,它仍然在终端的控制之下,因为它在前台.但是,如果它是后台进程,我必须在开始执行进程后将控制权返回给我的主shell.我
我正在为我的CS类编写一个 shell,项目的一部分涉及在后台运行一个进程,如果’&’字符由用户传入.

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

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

解决方法

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

>创建新管道时,调用setpgid()将管道的所有成员放入新的进程组(管道中第一个进程的PID作为PGID). (管道是shell在看到像ls | grep foo | wc -l这样的请求时启动的一系列进程 – 最简单的管道中只有一个进程).通常,在调用exec()之前,您将从管道中的第一个进程调用setpgid(0,0).>使用tcsetpgrp()来管理前台中的哪个进程组.如果将进程组从前台移动到后台,则可以将shell自己的进程组设置为前台进程组 – 您可以在shell中使用getpgid(0)获取此进程组.>当shell在后台时,它应该使用阻塞的waitpid()调用来等待子进程退出而不是显示提示.一旦前台管道中的每个进程都退出,它应该将自己重新置于前台(并显示提示).>当shell在前台时,它应该使用WNOHANG和WUNTRACED标志调用waitpid()以在显示提示之前检查子进程的状态 – 这将在它们停止或退出时通知您,并让你告知用户.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读