2

子プロセスを作成し、親プロセスを終了せずに SIGINT を子プロセスに送信しようとしています。私はこれを試しました:

pid=fork();
  if (!pid)
  {
      setpgrp();
      cout<<"waiting...\n";
      while(1);
  }
  else
      {
      cout<<"parent";
      wait(NULL);
      }

しかし、Ccを押すと、両方のプロセスが終了しました

4

3 に答える 3

8

を使用しないでくださいCTRL-C。これは、同じ制御端末 (つまり、同じセッション内) を持つすべてのプロセスにシグナルを送信します。それsetpgidは変わらないものですがsetsid、その目的のために (set session ID) 呼び出しがあると思います。

最も簡単な解決策は、セッションではなく特定のプロセスをターゲットにすることです。コマンドラインから:

kill -INT pid

C から:

kill (pid, SIGINT);

ここで、pid はシグナルの送信先のプロセス ID です。

親は からの戻り値から関連する PID を取得できますfork()。子が独自の PID を必要とする場合は、 を呼び出すことができますgetpid()

于 2009-11-19T05:58:28.963 に答える
4

あはは、プロセスグループとセッション、プロセスグループリーダーとセッショングループリーダーの謎が再び登場。

コントロール/C が信号をグループに送信しました。個別の pid にシグナルを送る必要があるため、paxdiablo の指示に従うか、親から子にシグナル (「kill」) を送信します。そして、忙しくしないでください!sleep(1) をループに入れるか、さらに良いことに、wait(2) システムコールの 1 つを入れます。

于 2009-11-19T06:07:55.177 に答える
3

子プロセスが実行されている場合は子プロセスを強制終了する (そうでない場合はアプリケーションをシャットダウンする) SIGINT シグナル ハンドラーの実装を試すことができます。

または、親の SIGINT ハンドラを SIG_IGN に設定し、子の SIGINT ハンドラを SIG_DFL に設定します。

于 2009-11-19T06:02:09.207 に答える