私は 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 をシェルに戻す必要がありますか? どうすればいいですか?
ありがとう!