3

cのメイン関数からバックグラウンドで子プロセスを実行したい。そのために fork および execv 関数を使用しました。しかし、子プロセスがまだ終了していない場合に備えて、親プロセスの最後に子バックグラウンド プロセスも強制終了したいと考えています。そのために kill(pChildPid) 関数を使用します。だから私の質問は

子プロセスが親プロセスの前に終了した場合、Linux OS は子プロセスと同じ pid を他のプロセスに割り当てることができますか? はいの場合、意図せずにそのプロセスを強制終了しますか?

4

4 に答える 4

5

はい、理論上は可能です。

ただし、プロセスを所有している場合、プロセスが終了したというメッセージをあなたwaitpidまたは同様の機能が受け取るまで、そのプロセスは「ゾンビ」プロセスになります (フォークされたプロセスdetachが所有プロセスから切断するために使用しない限り)。

デモンストレーションするには:

#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>

int main()
{
    int pid = fork();
    if (pid)
    {
        int p = 0;
        int status;
        sleep(60);
        p = wait(&status);
        std::cout << "Pid " << p << " exited..." << std::endl;
    }
    else
    {
        for(int i = 0; i < 20; i++)
        {
            std::cout << "Child is sleeping..." << std::endl;
            sleep(1);
        }
        std::cout << "Child exited..." << std::endl;
    }
    return 0;
}

これを実行しps a、プロセスを表示するために使用するa.outと、PID が互いに近い状態で 2 回表示されます。が出力child exitedされると、2 番目のプロセスのステータスが次のようになることがわかります。

12362 pts/0    Z+     0:00 [a.out] <defunct>

ここで Z は、「ゾンビ」プロセスであることを意味します。最初のプロセスの 60 秒が終了すると、消えます。

于 2013-09-20T12:25:20.480 に答える
2

分岐する場合はwait、子供のためにも実行する必要があります。これを行う前に子供が終了した場合、子供はゾンビのままになります。したがって、子を殺したいのに、そのステータスが返されるのを待っていない場合、子は固執し、PID は取得されません。この場合、それがもう実行されていなければ、効果がなくなっても安全に殺すことができます。待機して後で kill を送信した場合、子供のステータスを確認しないと、その間に PID が別のプロセスによって取得された可能性があります。

于 2013-09-20T12:24:50.940 に答える
1

子プロセスが終了すると、ゾンビ プロセス (実行中のプロセスのテーブルに残っているデッド プロセス) になるため、その親プロセスは終了コードを取得できます。

于 2013-09-20T12:24:46.820 に答える
0

はい、PID はインクリメントされ、最終的にはゼロに戻ります。そのため、プロセス終了し、後でその PID を使用して別のプロセスを実行できます。ただし、いつでも PPID をチェックして、それが親であることを確認できます。

于 2013-09-20T12:23:40.130 に答える