fork() でいくつかのプロセスを fork するプログラムを書きました。エラーが発生した場合は、すべての子プロセスと母プロセスを強制終了したい。exit(EXIT_FAILURE) を使用すると、子プロセスのみが強制終了されます。
system("killall [program_name]") について考えていますが、もっと良い方法があるはずです...
皆さん、ありがとうございました!レナート
UNIX では、SIGTERM、または SIGABRT、または SIGPIPE または sth を送信します。マザープロセスに似ています。このシグナルは、明示的にブロックまたは無視しない限り、すべてのクライアントに自動的に伝播されます。
getppid()
シグナルの送信先の PID を取得し、シグナルを送信するために使用しkill()
ます。
getppid() は、呼び出しプロセスの親のプロセス ID を返します。
kill() システム コールを使用して、任意のシグナルを任意のプロセス グループまたはプロセスに送信できます。
備考: 1. 使用system
は悪です。内部関数を使用してシグナルを送信します。2.killall
さらに邪悪になります。プログラムの複数のインスタンスが同時に実行されているとします。
親が終了した後に子プロセスを終了させる方法を参照してください。
Linux では、何らかの理由prctl()
で親プロセスが終了したときにプロセスのすべての子プロセスにシグナルを送信するように明示的に設計された呼び出しがあります。
私はチェックする必要があり、2番目の場所でそれを行うことはできませんがSIGPIPE
、 、SIGTERM
およびSIGABRT
すべての子供に伝播されることに関する ypnos の主張が正しいかどうかは本当にわかりません。
ただし、kill(-ppid)
(マイナス記号に注意してください) を使用すると、子プロセスがまだ親プロセスのプロセス グループにある限り、カーネルはすべての子プロセスにシグナルを配信します。
マザー プロセスがコマンド ラインで起動されていない場合、プロセス グループ リーダー (デーモンなど) ではない可能性があります。
親プロセスがプロセス グループ リーダーであることを確認するには、プロセスの初期化中に setsid() を呼び出します。
次に、子プロセスで、すべてのプロセスを終了させたい場合:
pgid = getpgid();
殺す (pgid、15);
兄弟全員に一時停止するように指示するなどのトリックを行うこともできます。
殺す (pgid、20);
そして再開します:
殺す (pgid、18);
自殺的なアプローチを検討してください -alarm()
プロセス (親と子の両方) の開始時に、正の秒数で を設定します。その時間内に計算が完了し、「エラーがない」場合は、呼び出しalarm(0)
てタイマーをキャンセルします。そうしないと、プロセスが強制終了されます (明示的にキャッチまたは無視していないと仮定SIGALRM
します)。