Estoy codificando un shell básico en C, y estoy trabajando para suspender un proceso hijo en este momento.Después de suspender el proceso secundario con SIGTSTP, el shell no responde
Creo que mi manejador de señal es correcto, y mi proceso hijo se suspende, pero después de eso, la terminal debe regresar al proceso principal y eso no está sucediendo.
El hijo está suspendido, pero mi shell ya no registra ninguna entrada o salida. tcsetpgrp() no parece estar ayudando.
Aquí está mi manejador de la señal en mi código 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);
}
Puede alguien decirme lo que estoy haciendo mal?
¿Estoy suspendiendo mi caparazón junto con el niño, y tengo que devolver stdin y stdout al shell de alguna manera? ¿Cómo haría esto?
Gracias!
Gracias por la respuesta. Intenté hacer lo que dices, pero cuando me llevo mi controlador de señal, el terminal simplemente suspende al padre y vuelve a bash. Necesito que el padre siga corriendo. – user1710304
Esto está completamente equivocado, no capturando SIGTSTP ciertamente haría que su caparazón se suspenda y permitirá que los procesos de los niños continúen. Necesita atraparlo para que su caparazón no se suspenda. Estoy enfrentando el mismo problema en este momento que se enfrentó anteriormente – Fingolfin
@AdelQodmani, solo el grupo de proceso en primer plano del terminal recibe un SIGTSTP cuando presiona Ctrl-Z. El shell que está esperando la finalización del proceso iniciado, está en un grupo de procesos que no es el grupo de procesos en primer plano del terminal. puedes ignorar SIGTSTP si quieres, es probable que lo hagan la mayoría de las conchas. Mi punto es que necesitas jugar con el grupo de proceso en primer plano de la terminal. –