私はCで基本シェルをコーディングしています。私は現在、子プロセスを中断しています。子プロセスをSIGTSTPでサスペンドした後、シェルが応答しない
私のシグナルハンドラは正しいと思いますが、私の子プロセスは中断していますが、その後、ターミナルは親プロセスに戻り、それは起こっていません。
子は中断されていますが、シェルは入力や出力をもう登録していません。 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を返す必要がありますか?どうすればいい?
ありがとうございます!
返信いただきありがとうございます。あなたが言うことをやってみましたが、シグナルハンドラを取り除くと、端末は親プロセスを一時停止し、bashに戻ります。私は親を走らせ続けなければならない。 – user1710304
これは間違ったことですが、SIGTSTPを捕捉しても、シェルが中断し、子プロセスが続行されることはありません。 彼はそれを捕まえる必要がありますので、シェルは中断しません。 私は前に直面した同じ問題に直面しています – Fingolfin
@AdelQodmani Ctrl-Zを押すと、端末のフォアグラウンドプロセスグループだけがSIGTSTPを受信します。起動したプロセスの終了を待っているシェルは、端末のフォアグラウンドプロセスグループではないプロセスグループ内にあります。もしあなたが好きなら、_ignore_ SIGTSTPすることができます。それは、ほとんどのシェルがすることでしょう。私の要点は、端末のフォアグラウンドプロセスグループで遊ぶ必要があるということでした。 –