6

このトリックif (fork()) exit(0);を使用して、現在のプロセスのpidを変更できることはわかっています。したがって、次のプログラムではpidが非常に速く変化します。このようなプロセスを強制終了するにはどうすればよいですか?フォークする前にkillall procname実行できるようになるまで多くを実行するよりも良い方法はありますか?kill()私はそれが「プロセス」ではないことを知っていますが、それぞれ数マイクロ秒で実行される多くのプロセスです。

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
    pid_t self = getpid();
    while (1)
    {
        if (fork()) exit(0);
        if (self + 10000 < getpid()) break; // Just to kill it after some time
        usleep(1000);
    }
    return 0;
}

また、プロセスを一覧表示する唯一の方法はps -A | grep procname、出力が表示されるまで数回実行することでした。プロセスが常にリストされていないのはなぜですか?

4

2 に答える 2

8

このようなプロセスは、システム管理者によって「コメット」と呼ばれます。

プロセスグループID(PGID)はフォーク上で変更されないためSIGSTOP、プロセスグループにシグナルを送信することでプロセスグループID(またはそれ)を強制終了できます(PIDの代わりに否定されたPGIDをに渡しますkill)。

于 2012-12-01T01:18:53.720 に答える
0

あなたがそれを見ることができない理由を私が見ることができる唯一の理由は、フォークされた子供がまだ作成されていないが、親はそれがもはやリストされていない死で十分に進歩したということです。

残念ながら、推測せずにこの種のプロセスを強制終了することはできないと思います。そのためには、次のpidを事前に知っておく必要があります。次のpidを推測することはできますが、他のpidに割り当てられていないことを確認することはできません。

于 2012-12-01T00:55:33.723 に答える