C 前台和后台进程有问题

C 前台和后台进程有问题,c,C,我试图用前台和后台进程制作一个shell,如果前台进程尝试访问终端,它将自动停止(因为它无法访问终端)。 首先,我将shell设置为忽略信号 SIGTSTP SIGINT SIGTTOU 分叉之后,对于前台和后台进程的子进程,我将子进程设置为将上面忽略的信号放回 SIG_DFL 此外,对于每个孩子,我还设置了他们的PGID,以便他们在不同的程序组中 前台和后台进程的父进程之间的区别在于,对于前台,我还为子终端提供访问权限: tcsetpgrp(STDIN, getpgid(getpid())

我试图用前台和后台进程制作一个shell,如果前台进程尝试访问终端,它将自动停止(因为它无法访问终端)。 首先,我将shell设置为忽略信号

SIGTSTP
SIGINT
SIGTTOU
分叉之后,对于前台和后台进程的子进程,我将子进程设置为将上面忽略的信号放回

SIG_DFL
此外,对于每个孩子,我还设置了他们的PGID,以便他们在不同的程序组中

前台和后台进程的父进程之间的区别在于,对于前台,我还为子终端提供访问权限:

tcsetpgrp(STDIN, getpgid(getpid()))
tcsetpgrp(STDOUT, getpgid(getpid())) 
此外,前台进程的父进程还等待子进程完成,然后再返回并再次请求用户提示

对于背景子级,父级只调用

continue
返回并请求更多用户提示。此外,我还有一个SIGCHLD信号处理程序,它带有一个waitpid()行,以确保后台进程不会变成僵尸

问题: 然而,我遇到的问题是,我的后台进程仍然可以访问终端(在后台进程中使用echo“hello”仍然有效),并且我的前台进程似乎忽略了由CTL+C和CTL+Z生成的信号,即使我在前台子进程以及后台子进程中重新启用了它们。 任何人都有可能出错的提示吗?

正常的shell工作原理不同,前台进程不是子进程。因此,我会这样做:

  • fork后台进程,然后在子集合信号中,关闭所有继承的文件描述符setprgp(从控制tty分离),打开文件以进行I/O重定向(如果需要)

  • 在父进程中,决定是等待子进程还是忽略它们(SIG_CHLD)