1

Linux システムのシグナルについて、簡単な質問が 1 つあります。私が理解しているように、すべてのプロセスには と がPIDありPGIDます。プロセスを作成すると、それは uniquePIDになります。関数を使用して新しいプロセスをフォークするとfork()、子プロセスは異なるPIDが同じになりPGIDます。

さて、コード

#include<stdio.h>
#include<unistd.h>
int main()
{
  int i=3;
  int j;
  for(j=0;j<i;++j)
  {
      if (fork() == 0)
      {
          while(1)
          {

          }
      }
  }
  printf("created\n");
  while(1)
  {

  }
  return 0;
}

このプログラムをコンパイルしてコマンドで実行すると

./foo

彼が子を作成するので少し待ってください。私が作成するCTRL-Cps aux、親と子がなくなっていることがわかります。

./foo

フォークが完了するのを待ち、他の端末で行う

kill -INT <pid_of_foo>

ps aux親がいなくなったことがわかりますが、子供たちはまだ生きていて、私の CPU を食べています。

よくわかりませんCTRL-Cが、あるプロセスグループにあるすべてのプロセスにシグナルをKILL -SIGNAL pid送信し、コマンドがPID=pidnotを使用してプロセスにシグナルを送信しているようPGID=pidです。

私は正しい軌道に乗っていますか?はいの場合、キーの組み合わせがプロセスを強制終了するのはなぜPGIDですかPID?

4

1 に答える 1

2

シグナル配信、プロセス グループ、およびセッション

はい、あなたは正しい軌道に乗っています。

BSD リリース以降の最新の Unix バリアントは、セッションプロセス グループを実装しています。

セッションは、プロセス グループのグループとして見ることができます。tty または疑似 tty ラインでの 1 回のログインから生じるすべてがセッションの一部であり、1 つのシェル パイプラインまたはその他のプロセスの論理グループに関連するものは 1 つのプロセス グループに編成されるという考えでした。

これにより、フォアグラウンドとバックグラウンドの間で「ジョブ」を移動し、シグナルを配信することがより便利になります。シェル ユーザーは、ほとんどの場合、個々のプロセスについて心配する必要はありませんが、関連するコマンドのグループを直感的な方法で制御できます。

キーボードによって生成されたシグナルは、セッションのフォアグラウンド プロセス グループに送信されます。使用しているCLIkillコマンドは、シグナルを個々のプロセスに配信します。^C 配信メカニズムを複製したい場合は、使用できますkill 0。これにより、同じプロセス グループのすべてのメンバーにシグナルが送信され、スクリプトから実行された場合は、必要なことが行われる可能性があります。


注:質問を編集して、GPID を PGID に変更しました。

于 2012-05-12T19:21:06.487 に答える