リサイクルされたPIDを処理するときは、PIDのプロセスが有効になっていることを確認してください。

リサイクルされたPIDを処理するときは、PIDのプロセスが有効になっていることを確認してください。

私がオンラインで見たところによると、C ++でkillメソッドを呼び出して、プロセスがまだ生きていることを確認します。問題は、PIDが循環していて、探している同じPIDが同じプロセスではない可能性があることです。お互いの子ではなく、2つのプロセスを持つプログラムがあります。それらと通信できる唯一の方法はIPCです。クライアントプロセスが終了したら、私のホストプロセスも終了したいと思います。これを行うには、クライアントのプロセスがもう存在しない時期を知る必要があります。

Windowsには、ハンドルを作成したプロセスが閉じられるまでPIDがリサイクルされないようにする、いわゆるプロセスハンドラがあります。 macOS / Linux(POSIX)システムでこれを実装する方法を知りたいです。

問題のコードはPIDにリサイクルされます。

if (0 == kill(pid, 0))
{
    // Process exists.
}

ベストアンサー1

私がオンラインで見たところによると、C ++でkillメソッドを呼び出して、プロセスがまだ生きていることを確認します。問題は、PIDがループしていて、探している同じPIDが同じプロセスではない可能性があることです。

はい。したがって、このkillアプローチはいいえ働く実際、物語はここで終わります。効果的なツールではありません。

2つのオプション:

  • 監視しているプロセスが自分の子プロセス(または自分のプロセスグループ内のプロセス)である場合は、waitpid特に終了時点を監視してください。
  • プロセスが次のような場合いいえ子プロセスに関して、POSIX「理想的」は、自分のプロセスが必ずしもそのプロセスのライフサイクルと密接にやり取りする必要はないと言います(少なくともこれがwaitpid制限から下された結論です)。 「追跡」権限を持ち、それを使用して他のptraceプロセスに接続し、exit呼び出しを待つことができます。

おすすめ記事