Después de suspender el proceso hijo con SIGTSTP, el shell no responde

Estoy codificando un shell básico en C, y estoy trabajando en suspender un proceso secundario en este momento.

Creo que mi manejador de señales es correcto, y mi proceso hijo se suspende, pero después de eso, el terminal debería volver al proceso padre y eso no está sucediendo.

El niño está suspendido, pero mi shell ya no registra ninguna entrada o salida. tcsetpgrp () no parece estar ayudando.

Aquí está mi controlador de señal en mi código de shell para 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);
}

¿Alguien puede decirme qué estoy haciendo mal?

¿Estoy suspendiendo mi caparazón junto con el niño, y tengo que devolver la entrada y la salida de la consola de alguna manera? ¿Cómo haría esto?

¡Gracias!

Respuestas a la pregunta(4)

Su respuesta a la pregunta