2

重複の可能性:
SIGTSTP で子プロセスを一時停止した後、シェルが応答しない

私は C で基本的なシェルをコーディングしており、現在、子プロセスの一時停止に取り組んでいます。

これを行うには 2 つの方法があります。

  • 1 つは、最後にps&a を付けて入力に入力し、( , )&を呼び出してから、子をプロセスの配列に入れることです。killpidchild_pidpidbg

  • 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どうすればいいですか?

ありがとう!

4

0 に答える 0