子プロセスを作成し、親プロセスを終了せずに SIGINT を子プロセスに送信しようとしています。私はこれを試しました:
pid=fork();
if (!pid)
{
setpgrp();
cout<<"waiting...\n";
while(1);
}
else
{
cout<<"parent";
wait(NULL);
}
しかし、Ccを押すと、両方のプロセスが終了しました
を使用しないでくださいCTRL-C。これは、同じ制御端末 (つまり、同じセッション内) を持つすべてのプロセスにシグナルを送信します。それsetpgid
は変わらないものですがsetsid
、その目的のために (set session ID) 呼び出しがあると思います。
最も簡単な解決策は、セッションではなく特定のプロセスをターゲットにすることです。コマンドラインから:
kill -INT pid
C から:
kill (pid, SIGINT);
ここで、pid はシグナルの送信先のプロセス ID です。
親は からの戻り値から関連する PID を取得できますfork()
。子が独自の PID を必要とする場合は、 を呼び出すことができますgetpid()
。
あはは、プロセスグループとセッション、プロセスグループリーダーとセッショングループリーダーの謎が再び登場。
コントロール/C が信号をグループに送信しました。個別の pid にシグナルを送る必要があるため、paxdiablo の指示に従うか、親から子にシグナル (「kill」) を送信します。そして、忙しくしないでください!sleep(1) をループに入れるか、さらに良いことに、wait(2) システムコールの 1 つを入れます。
子プロセスが実行されている場合は子プロセスを強制終了する (そうでない場合はアプリケーションをシャットダウンする) SIGINT シグナル ハンドラーの実装を試すことができます。
または、親の SIGINT ハンドラを SIG_IGN に設定し、子の SIGINT ハンドラを SIG_DFL に設定します。