После приостановки дочернего процесса с 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 в оболочку? Как бы я это сделал?
Спасибо!