プロセス生成リークを「シミュレート」して軽減するために、どのオペレーティングシステムコールを利用できますか?たとえば、フォーク爆弾は私が望むものと似ていますが、フォーク爆弾はプロセスを指数関数的に増加させます。私が望むのは、時間の経過とともにプロセスをゆっくりと漏らし、時間の経過とともに検出するのがより簡単で、実際の状況がより現実的になるようにするシステムコールまたはフレームワークのアイデアです。
答え1
遅いプロセスリークが必要な場合は、次のように終了できます。
#include <stdio.h>
#include <unistd.h>
int main(void)
{
for (;;) {
pid_t pid = fork(); // (1)
if (pid < 0) {
perror("fork");
return 1;
}
if (pid > 0) { // (2)
for (;;) {
sleep(60 * 60);
}
}
// pid == 0 : child (3) keep looping
usleep(1000000); // 1 second
}
}
この手順を繰り返す。
- 新しいプロセスの作成
- プロセスが親プロセスの場合は、無限スリップループに入ります。
- プロセスが子プロセス(新しいプロセス)の場合は、しばらく待ってからループを続行します。上記のようにプロセスが繰り返されます。
これにより、 process から始めることができますA
。 A
生成されB
、A
無限スリープループに入ります。 B
繰り返して生成し、C
無限B
の睡眠ループに入ります。 C
引き続きDを生成し、ループを生成してからC
無限の睡眠ループに陥ります。時間の経過とともに、毎秒新しいプロセスが作成されます。プログラムが十分に長時間実行されると、fork()
リソースの枯渇が原因で最終的に失敗し、以前のすべてのプロセスが無期限の休止状態になります。
リークがより早く発生するようにするには、usleep()
関数に少数の値を渡すだけです。