gpt4 book ai didi

c - 在 C 中实现类似 shell 的作业控制

转载 作者:行者123 更新时间:2023-11-30 14:45:37 26 4
gpt4 key购买 nike

我正在尝试用 C 语言实现简单的 shell,但我很难实现作业控制。网上的一切看起来都很复杂,我认为简单一些总是好的。所以让我问这个......调用 fork() 后,我可以仅使用 2 个函数和 pid 来处理 Ctrl-Z 信号吗?

我想调用一个函数,例如put_background(pid_t pid) 当我按下 Ctrl-Z 并使用 pid = pid 进行进程以运行后台并最终调用另一个函数时put_foreground(pid_t pid) 当我写 fg 时,我希望 pid = pid 的进程再次转到前台。

那么,这可能吗?如有任何帮助,我们将不胜感激。但是,请编写更多代码。

最佳答案

I am trying to implement simple shell in C language and i am having a hard time implementing job control. Everything online seems complicated enough and i think some simplicity is always good.

So let me ask this ... After fork() is called can i handle Ctrl-Z signal with just 2 function and just with the pid ?

请注意,Ctrl-Z 主要对终端驱动程序有意义。它会导致将 SIGTSTP 发送到键入该字符的终端的前台进程组,即将该终端作为其控制终端并具有读取权限的进程组从中。默认情况下,这会导致该组中的进程停止,但仅此而已。您无需执行任何操作即可实现这一目标。*

I want to call a function e.x. put_background(pid_t pid) when i hit Ctrl-Z and make process with pid = pid to run background and finally call another function e.x. put_foreground(pid_t pid) when i write fg and i want the process with pid = pid to go to foreground again.

根据定义和设计,在任何特定时间至多一个进程组可以控制给定的终端。因此,要将前台作业移动到后台,您所需要做的就是将另一个作业移动到前台。这可以是 shell 本身,也可以是它控制下的其他一些作业。 tcsetpgrp()库函数可以完成这个任务。除非是 shell 本身,否则您还需要向该进程组发送 SIGCONT 以防它停止。

您还需要一种机制来恢复已停止的后台作业,但这很简单:只需向该进程组发送 SIGCONT 即可。

So, is this possible? Any help is appreciated.. code more however.

当然,您可以编写一个函数将作业移至前台并恢复它,另一个函数用于恢复后台作业。这些函数需要的关于它们所操作的作业的唯一信息是它们的进程组 ID(与其初始进程的进程 ID 相同)。

但是您还需要对当前事件作业进行一些簿记,并且需要注意开始新作业,并且需要监视当前作业(尤其是前台作业),以便能够适本地协调所有转换。

GLIBC 手册有 an entire chapter on job control ,包括专门关于实现作业控制 shell 的重要部分。即使您不是为基于 GLIBC 的系统编写代码,这也可能对您有用。实际所需的代码并不那么复杂,但要获得正确的代码需要对相当广泛的概念有很好的理解。

<小时/>

*但是您确实需要确保您的 shell 将它启动的命令放入与其自己不同的进程组中,否则 Ctrl-Z 也会停止它。

关于c - 在 C 中实现类似 shell 的作业控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52909326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com