在孩子上调用SIGTSTP后,没有来自父母的回复

时间:2012-09-30 20:06:49

标签: c linux shell signals

  

可能重复:
  After suspending child process with SIGTSTP, shell not responding

我正在用C编写一个基本shell,我正在努力暂停子进程。

应该有两种方法可以做到这一点。

  • 一种是当我在输入中输入ps&时,最后输入&,我会调用killpidchild_pid然后我将孩子的pid放入bg进程的数组中。

  • 第二个是当我在当前正在运行的子流程上按 CTRL - Z 时。

我认为我的信号处理程序是正确的,并且我的子进程正在挂起,但在此之后,终端应该返回到父进程并且没有发生。

孩子被暂停,但我的shell不再注册任何输入或输出。 tcsetpgrp()似乎没有帮助。

这是SIGTSTP的shell代码中的信号处理程序:

void suspend(int sig) {
    pid_t pid;
    sigset_t mask;
    //mpid is the pgid of this shell.
    tcsetpgrp(STDIN_FILENO, mpid);
    tcsetpgrp(STDOUT_FILENO, mpid);
    sigemptyset(&mask);
    sigaddset(&mask, SIGTSTP);
    sigprocmask(SIG_UNBLOCK, &mask, NULL);
    signal(SIGTSTP, SIG_DFL);
    //active.pid is the pid of the child currently in the fg.
    if (active.pid != 0) {
        kill(active.pid, SIGTSTP);
    }
    else{
        //if this code is being run in the child, child calls SIGTSTP on itself.
        pid = getpid();
        if (pid != 0 && pid != mpid){
            kill(pid, SIGTSTP);
        }
    }
    signal(SIGTSTP, suspend);
}

谁能告诉我我做错了什么?

我是否将我的shell与孩子一起暂停,我是否需要以某种方式将stdinstdout返回到shell?我该怎么做?

谢谢!

0 个答案:

没有答案