私がオンラインで見たところによると、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
呼び出しを待つことができます。