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!