Po zawieszeniu procesu potomnego za pomocą SIGTSTP powłoka nie odpowiada

Koduję podstawową powłokę w C i teraz pracuję nad zawieszeniem procesu potomnego.

Myślę, że mój program obsługi sygnału jest poprawny, a mój proces potomny zawiesza się, ale po tym terminal powinien powrócić do procesu macierzystego i to się nie dzieje.

Dziecko jest zawieszone, ale moja powłoka nie rejestruje już żadnego wejścia ani wyjścia. tcsetpgrp () wydaje się nie pomagać.

Oto mój program obsługi sygnału w moim kodzie powłoki dla 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);
}

Czy ktoś może mi powiedzieć, co robię źle?

Czy zawieszam moją powłokę wraz z dzieckiem i czy muszę jakoś zwrócić stdin i stdout do powłoki? Jak bym to zrobił?

Dzięki!

questionAnswers(4)

yourAnswerToTheQuestion