【问题标题】:trouble with foreground and background processes前台和后台进程的问题
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 2020-06-14
      相关资源
      最近更新 更多