重複の可能性:
SIGTSTP で子プロセスを一時停止した後、シェルが応答しない
私は C で基本的なシェルをコーディングしており、現在、子プロセスの一時停止に取り組んでいます。
これを行うには 2 つの方法があります。
1 つは、最後に
ps&
a を付けて入力に入力し、( , )&
を呼び出してから、子をプロセスの配列に入れることです。kill
pid
child_pid
pid
bg
2 つ目は、現在実行中の子プロセスでCTRL-を押したときです。Z
シグナルハンドラーは正しく、子プロセスは一時停止していると思いますが、その後、端末は親プロセスに戻るはずですが、それは起こっていません。
子は中断されていますが、私のシェルは入力または出力を登録していません。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
どうすればいいですか?
ありがとう!