【发布时间】:2011-10-10 18:01:54
【问题描述】:
我正在尝试使用前台和后台进程制作一个 shell,如果前台进程尝试访问终端,它将自动停止(因为它无法访问终端)。 发生的情况是,起初,我将 shell 设置为 IGNORE 信号
SIGTSTP
SIGINT
SIGTTOU
分叉后,对于前台和后台进程的子进程,我设置子进程将上面忽略的信号放回
SIG_DFL
另外,对于每个孩子,我还设置了他们的pgid,这样他们就在不同的程序组中。
我对前台和后台进程的父进程的区别在于,对于前台,我也给了子终端访问权限:
tcsetpgrp(STDIN, getpgid(getpid()))
tcsetpgrp(STDOUT, getpgid(getpid()))
此外,前台进程的父进程也会等待子进程完成,然后再循环返回并再次请求用户提示。
对于背景孩子,父母只是调用
continue
循环返回并要求更多用户提示。此外,我还有一个带有 waitpid() 行的 SIGCHLD 信号处理程序,以确保没有后台进程成为僵尸进程。
问题: 但是,我遇到的问题是我的后台进程仍然可以访问终端(在后台进程中使用 echo "hello" 仍然有效),而我的前台进程似乎忽略了 CTL+C 和 CTL+ 生成的信号Z 即使我在前台孩子以及背景孩子中重新启用了它们。 任何人都暗示可能出了什么问题?
【问题讨论】:
标签: c