创建我自己的 shell。处理 Ctrl-Z 然后发送 SIGCONT 关闭进程而不是继续它
Creating my own shell. Handling Ctrl-Z and then sending SIGCONT closes the process instead of continue it
我正在用 C 语言创建自己的 shell。到目前为止,我实现了许多功能,但我遇到的问题是 CTRL-Z 处理 (SIGTSTP)。让我详细说明成功尝试的问题:
当我在 shell 中执行程序(如 gedit),然后按 Ctrl-Z 时,它会执行 kill(p_id, SIGTSTP) 并停止该进程。 shell 还在 background_processes 数组中添加进程 ID,以便我们可以进一步访问它。然后,如果我在 shell 中键入 "fg",它会将进程带到前台并执行 kill(p_id, SIGCONT) 以便我们可以继续使用该程序。 shell 还通过执行 waitpid 函数等待进程完成。我们通过单击 X 按钮或按 Ctrl-C 来关闭程序。 Linux shell 中的内容完全相同。成功!!!
如果我通过指定 &(& 符号)在后台执行我的 shell(如 gedit)中的程序,它会自动在后台启动此进程,而不会等待该进程。但它在 background_processes 数组中添加了进程 ID,因此我们可以进一步访问它。然后,当我在 shell 中键入 "fg" 时,它会将进程带到前台。它实际上是通过执行 waitpid 函数来等待进程完成。同样,如果后台有多个进程也没关系,它们将被一个一个地带到前台。我们通过单击 X 按钮或按 Ctrl-C 来关闭程序。 Linux shell 中的内容完全相同。成功!!!
让我们在前台执行一个进程,然后通过Ctrl-Z将其发送到后台,在后台执行一个进程。我们在后台有 2 个进程。如果我输入 "fg" 它会将第一个后台进程带到前台并等待它。如果我按下关闭程序的 X 按钮(关闭按钮),shell 将第二个进程带到前台并等待它。进展顺利,这就是我们想要的。所以这个场景也很好用。
问题场景和前面创建进程的场景一样。当我键入 "fg" 时,它会将第一个后台进程带到前台并等待它。但是,如果我按 Ctrl-C,它会关闭两个进程!!!!!!!它应该只关闭第一个进程,应该等待第二个进程!!!
我到处搜索,什么都试过了,还是想不通。但问题似乎与第 525 行有关。当我发送 SIGCONT 信号时,它会关闭进程。但是,如果评论该行,它不会关闭,但我也无法使用该过程,因为它已停止!!!
我的 GitHub 存储库中有代码:https://github.com/EmreKumas/Myshell
感谢阅读...
看来问题是进程组引起的。我确实只为后台作业创建了不同的进程组,但是由于在执行 exec 命令后不能更改子进程的进程组,所以最好在 exec 调用之前开始。现在,由于“@that other guy”和“@John Bollinger”,问题得到了解决。
我正在用 C 语言创建自己的 shell。到目前为止,我实现了许多功能,但我遇到的问题是 CTRL-Z 处理 (SIGTSTP)。让我详细说明成功尝试的问题:
当我在 shell 中执行程序(如 gedit),然后按 Ctrl-Z 时,它会执行 kill(p_id, SIGTSTP) 并停止该进程。 shell 还在 background_processes 数组中添加进程 ID,以便我们可以进一步访问它。然后,如果我在 shell 中键入 "fg",它会将进程带到前台并执行 kill(p_id, SIGCONT) 以便我们可以继续使用该程序。 shell 还通过执行 waitpid 函数等待进程完成。我们通过单击 X 按钮或按 Ctrl-C 来关闭程序。 Linux shell 中的内容完全相同。成功!!!
如果我通过指定 &(& 符号)在后台执行我的 shell(如 gedit)中的程序,它会自动在后台启动此进程,而不会等待该进程。但它在 background_processes 数组中添加了进程 ID,因此我们可以进一步访问它。然后,当我在 shell 中键入 "fg" 时,它会将进程带到前台。它实际上是通过执行 waitpid 函数来等待进程完成。同样,如果后台有多个进程也没关系,它们将被一个一个地带到前台。我们通过单击 X 按钮或按 Ctrl-C 来关闭程序。 Linux shell 中的内容完全相同。成功!!!
让我们在前台执行一个进程,然后通过Ctrl-Z将其发送到后台,在后台执行一个进程。我们在后台有 2 个进程。如果我输入 "fg" 它会将第一个后台进程带到前台并等待它。如果我按下关闭程序的 X 按钮(关闭按钮),shell 将第二个进程带到前台并等待它。进展顺利,这就是我们想要的。所以这个场景也很好用。
问题场景和前面创建进程的场景一样。当我键入 "fg" 时,它会将第一个后台进程带到前台并等待它。但是,如果我按 Ctrl-C,它会关闭两个进程!!!!!!!它应该只关闭第一个进程,应该等待第二个进程!!!
我到处搜索,什么都试过了,还是想不通。但问题似乎与第 525 行有关。当我发送 SIGCONT 信号时,它会关闭进程。但是,如果评论该行,它不会关闭,但我也无法使用该过程,因为它已停止!!!
我的 GitHub 存储库中有代码:https://github.com/EmreKumas/Myshell
感谢阅读...
看来问题是进程组引起的。我确实只为后台作业创建了不同的进程组,但是由于在执行 exec 命令后不能更改子进程的进程组,所以最好在 exec 调用之前开始。现在,由于“@that other guy”和“@John Bollinger”,问题得到了解决。