Sto codificando una shell di base in C e sto lavorando per sospendere un processo figlio in questo momento.Dopo aver sospeso il processo figlio con SIGTSTP, la shell non risponde
Penso che il mio gestore di segnale sia corretto e che il processo figlio sia sospeso, ma dopo, il terminale dovrebbe tornare al processo genitore e ciò non sta accadendo.
Il figlio è sospeso, ma la mia shell non registra più alcun input o output. tcsetpgrp() non sembra essere d'aiuto.
Ecco il mio gestore di segnale nel mio codice di shell per 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);
}
Qualcuno può dirmi che cosa sto facendo male?
Sto sospendendo il mio guscio insieme al bambino, e devo in qualche modo restituire stdin e stdout alla shell? Come lo farei?
Grazie!
Grazie per la risposta. Ho provato a fare quello che dici, ma quando togli il mio gestore di segnale il terminale sospende il genitore e torna a bash. Ho bisogno che il genitore continui a correre. – user1710304
Questo è semplicemente sbagliato, non catturare SIGTSTP causerebbe certamente la sospensione della shell e lascerà andare i processi figli. Ha bisogno di prenderlo così il suo guscio non sospenderà. Sto affrontando lo stesso problema in questo momento ha affrontato in precedenza – Fingolfin
@AdelQodmani, solo il gruppo di processi in foreground del terminale riceve un SIGTSTP quando si preme Ctrl-Z. La shell che attende solo la conclusione del processo avviato, si trova in un gruppo di processi che non è il gruppo di processi in primo piano del terminale. puoi _ignore_ SIGTSTP se vuoi, è probabile ciò che fa la maggior parte delle shell. Il punto è che è necessario giocare con il gruppo di processi in primo piano del terminale. –