2
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>

int main(){

    pid_t pid = fork();

    if(pid==0){
            system("watch ls");
    }
    else{
            sleep(5);
            killpg(getpid(),SIGTERM);  //to kill the complete process tree.
    }
    return 0;
}

ターミナル:

anirudh@anirudh-Aspire-5920:~/Desktop/testing$ gcc test.c
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ ./a.out
Terminated

最初の5秒間は、「watch ls」の出力が表示され、SIGTERMを送信したために終了します。

質問:プロセスはどのようにしてそれ自体を殺すことができますか?kill(getpid()、SIGTERM);を実行しました。

私の仮説: したがって、kill()呼び出し中に、プロセスはカーネルモードに切り替わります。kill呼び出しは、SIGTERMをプロセスに送信し、プロセスのプロセステーブルにコピーします。プロセスがユーザーモードに戻ると、テーブル内の信号が表示され、それ自体が終了します(どのように?私は本当に知りません) (私は仮説のどこかで間違っていると思います(失敗かもしれません)...だからお願いします私を啓発します)

このコードは、実際には、プロジェクトの他のモジュールをテストするために使用しているスタブです。それは私のために仕事をしていて、私はそれに満足していますが、プロセスが実際にどのようにそれ自体を殺すのかという疑問が私の心にあります。ステップバイステップの仮説を知りたいです。

前もって感謝します

アニルード・トマー

4

5 に答える 5

3

killpg()プロセスではなくプロセスグループにシグナルを送信するを使用しているため、プロセスが停止します。

あなたの場合fork()、子は特にプロセスグループを父親から継承します。からman fork:

   *  The child's parent process ID is the same as the parent's process ID.

だからあなたは子供と一緒に親を殺します。

あなたが簡単なことをするkill(getpid(), SIGTERM)と、父親は子供を殺し(つまりwatching ls)、平和的に終了します。

于 2011-02-15T18:05:17.417 に答える
2

そのため、kill() 呼び出し中に、プロセスはカーネル モードに切り替わります。kill 呼び出しは SIGTERM をプロセスに送信し、それをプロセスのプロセス テーブルにコピーします。プロセスがユーザーモードに戻ると、テーブルにシグナルが表示され、プロセス自体が終了します(方法はわかりません)

Linux では、カーネル モードからユーザー空間モードに戻るときに、配信できる保留中のシグナルがあるかどうかをカーネルがチェックします。いくつかある場合は、ユーザー空間モードに戻る直前にシグナルを配信します。また、プロセスがブロックされてから強制終了select()された場合や、スレッドがマップされていないメモリ位置にアクセスした場合など、他のときにシグナルを配信することもできます。

于 2011-02-15T18:22:52.873 に答える
0

プロセステーブルでSIGTERMシグナルを見ると、最初に子プロセスを強制終了し( killpg() を呼び出したので完全なツリー)、次に exit() を呼び出します。

私はまだこの質問に対するより良い答えを探しています。

于 2011-01-09T04:35:40.660 に答える
0
kill(getpid(), SIGKILL);  // itself I think

case 0:の後にテストしたところfork、別の親プロセスから定期的に終了しました。

これが標準的な認証方法なのかはわかりませんが……。

(私の psensor ツールから、カウンターが停止している通常のプログラム コードのように、CPU 使用率が 34% で戻ることがわかります)。

于 2014-08-29T16:34:56.323 に答える
-4

これは、Perl では非常に簡単です。

   { 
        local $SIG{TERM} = "IGNORE";
        kill TERM => -$$;
   }

C への変換は、読者の課題として残されています。

于 2011-02-15T18:24:50.867 に答える