После приостановки дочернего процесса с SIGTSTP оболочка не отвечает

Я кодирую базовую оболочку на C и сейчас работаю над приостановкой дочернего процесса.

Я думаю, что мой обработчик сигналов правильный, и мой дочерний процесс приостанавливается, но после этого терминал должен вернуться к родительскому процессу, а этого не происходит.

Ребенок приостановлен, но моя оболочка больше не регистрирует ввод или вывод. tcsetpgrp (), похоже, не помогает.

Вот мой обработчик сигнала в моем коде оболочки для SIGTSTP:

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);
}

Может кто-нибудь сказать мне, что я делаю не так?

Подвожу ли я свою оболочку вместе с ребенком, и нужно ли мне как-то вернуть stdin и stdout в оболочку? Как бы я это сделал?

Спасибо!

Ответы на вопрос(4)

Ваш ответ на вопрос