我正在尝试使用前台和后台进程创建一个shell,如果前台进程尝试访问终端,它将自动停止(因为它无法访问终端)。 首先,我将我的shell设置为IGNORE信号
SIGTSTP
SIGINT
SIGTTOU
分叉后,对于前景和后台进程的子进程,我设置子进程将上面忽略的信号放回到
SIG_DFL
此外,对于每个孩子,我也设置了他们的pgids,以便他们在不同的程序组中。
我在前台和后台进程的父进程之间的区别在于,对于前台,我还给了子终端访问:
tcsetpgrp(STDIN, getpgid(getpid()))
tcsetpgrp(STDOUT, getpgid(getpid()))
此外,前台进程的父进程也会在循环回来并再次询问用户提示之前等待子进程完成。
对于后台孩子,父母只需要调用
continue
循环回来并要求更多用户提示。另外,我还有一个带有waitpid()行的SIGCHLD信号处理程序,以确保没有后台进程成为僵尸。
问题: 但是,我遇到的问题是我的后台进程仍然可以访问终端(在后台进程中使用echo“hello”仍然有效),我的前台进程似乎忽略了CTL + C和CTL +生成的信号Z即使我在前景孩子和背景孩子中重新启用它们。 任何人都有可能出错的提示吗?
答案 0 :(得分:0)
“普通”shell的工作方式不同,前台进程不是子进程。因此我会这样做:
fork后台进程,然后在子设置信号中,关闭所有继承的文件描述符,setprgp(从控制tty分离),打开文件进行I / O重定向(如果需要)
,决定是否要等待子进程或忽略它们(SIG_CHLD)