子プロセスを生成し、一定時間実行し、終了していない場合は強制終了する関数を作成しようとしています。
int sysExecTimeout(const char * exePath, int timeoutSec);
この関数では、 and を使用fork
しexecl
て子をスポーンし、タイムアウトになったら and を使用kill(pid, SIGTERM)
しkill(pid, SIGKILL)
て 2 秒後に子が確実に終了するようにします。
pid_t pid = fork();
if(pid == 0) {
execl("/bin/sh", "sh", "-c", exePath);
exit(127);
} else if(pid != -1) {
// timeout code
if(timeout) {
kill(pid, SIGTERM);
sleep(2);
kill(pid, SIGKILL);
}
}
私は Linux を使用していますが、親プロセスが終了しても、子プロセスは自動的に強制終了されないようです。の子プロセスであるため、2 つのkill
呼び出しは単に/bin/sh
プロセスを強制終了し、exePath
コマンドを実行したままにし/bin/sh
ます。
sysExecTimeout
をルートとするプロセス ツリー全体を強制終了するような関数を作成しようとしています。PID はpid
どこにありますかpid
pid = fork()
exePath
コマンドが他のコマンドを生成するため、これが必要です。これは、スタックしてリソースを消費する可能性のある他のコマンドも生成する可能性があります。
実行されるバイナリ/スクリプトを制御exePath
できないため、独自の親が死ぬので子供を殺すロジックをそれらに書くことはできません。
を使用してみkill(0, SIGTERM)
ましたが、これはほとんど仕事をしましたが、自分のプロセスも強制終了しました:)
プロセスツリー全体がそのプログラムから開始されるように、Cでプログラムでオンにできるフラグがあるかどうか疑問に思っています。死ぬ(PID / PPIDチェーンをたどることができると仮定)。
ここでそのフラグを使用できます:
if(pid == 0) {
turnOnRecursiveDeathFlag();
system(exePath);
//execl("/bin/sh", "sh", "-c", exePath);
exit(127);
}
それを行う方法はありますか?私はしばらく探していましたが、私が見つけることができるのは、を使用したハックps -ef
、または実行中の子プロセスの変更などです.