我正在用C语言创建自己的shell。到目前为止,我实现了许多功能,但是遇到问题的是CTRL-Z处理(SIGTSTP)。让我指定成功尝试后的问题:
当我在shell中执行一个程序(如gedit),然后按Ctrl-Z时,它将执行kill(p_id,SIGTSTP)并停止该进程。外壳程序还在background_processes数组中添加了进程ID,以便我们进一步了解它。然后,如果我在外壳程序中键入“ fg”,它将使进程进入前台并执行kill(p_id,SIGCONT),以便我们可以继续使用该程序。外壳程序还通过执行waitpid函数来等待进程完成。我们通过单击X按钮或按Ctrl-C关闭程序。在Linux Shell中完全一样。成功!!!
如果我通过指定&(与号)在后台的Shell中执行程序(如gedit),则它会在后台自动启动此进程,而无需等待该进程。但是它在background_processes数组中添加了进程ID,因此我们可以进一步了解它。然后,当我在外壳程序中键入“ fg”时,它将使过程进入前台。它实际上通过执行waitpid函数来等待该过程完成。同样,后台有多个进程也没有关系,它们将被一个接一个地呈现到前台。我们通过单击X按钮或按Ctrl-C关闭程序。在Linux Shell中完全一样。成功!!!
让我们在前台执行一个过程,然后通过Ctrl-Z将其发送到后台,然后在后台执行一个过程。我们在后台有2个流程。如果我键入“ fg”,它将第一个后台进程带到前台并等待。如果我按下X按钮(关闭按钮)以关闭程序,shell将第二个进程带到前台并等待它。进行得很好,这就是我们想要的。因此,这种情况也很好。
该问题方案与创建过程中的先前方案相同。当我键入“ fg”时,它将第一个后台进程带到前台并等待它。但是,如果我按Ctrl-C,它将关闭两个进程!它应该只关闭第一个进程,而应该等待第二个进程!!!
我到处搜索,尝试了所有内容,但无法弄清楚。但是问题似乎与525行类似。当我发送SIGCONT信号时,它关闭了进程。但是,如果注释该行,它不会关闭,但是由于它已停止,我也无法使用该过程!!!
我的GitHub存储库中包含以下代码:https://github.com/EmreKumas/Myshell
感谢阅读...
答案 0 :(得分:0)
问题似乎是由于进程组引起的。我只是为后台作业创建了不同的进程组,但是由于您不能在执行exec命令后更改子进程组,因此最好在exec调用开始之前进行操作。现在,由于有了“ @that other guy”和“ @John Bollinger”,问题得以解决。