4

Windows で SIGCHLD 機能を使用したいと考えています (つまり、子プロセスが終了したときに親プロセスに通知します)。Windows API に SIGCHLD に相当するものがないことは承知していますが、これを Windows で実装するための一般的な方法を教えてください。これは、Windows 開発者がかなり頻繁に遭遇する問題だと確信しています。

私が今考えている唯一の解決策は、子供たちをポーリングして、彼らがまだ生きているかどうかを確認することです.

注: 私のアプリケーションはシングル スレッドであり、可能であればそれを維持したいと考えています。アプリケーションには非ブロッキング イベント ループがあります (select() を使用)。

4

2 に答える 2

5

これらの子プロセスを自分で生成すると、 Jobオブジェクトを使用でき、ジョブの一部であるプロセスが終了したときに通知を受け取ることができます。

JobObjectAssociateCompletionPortInformationを使用して、JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESSまたはをキャッチしJOB_OBJECT_MSG_EXIT_PROCESSます。

于 2012-02-09T19:34:23.787 に答える
5

これが最善の方法かどうかはわかりませんが、確かに方法です。

でプロセスを作成していると思いますCreateProcessPROCESS_INFORMATIONこれは member を含む構造体を返しますhProcess。これは、作成した子プロセスへのハンドルです。

ここから、このハンドルを で待つことができますWaitOnSingleObject。これは、指定されたハンドルが通知されるまでブロックされます (ただし、この非ブロックを実行したい場合はタイムアウトが必要です。これselectは、得られるものに最も近いものです)。

マルチスレッドルートを使用する場合は、別のスレッドで待機し、WaitOnSingleObjectパスしたときに、それに応じて親プロセス内のワーカースレッドに通知できます。

selectシングルスレッド スタイルでは、スタイルのセマンティクスを使用すると、ループ内でハンドルをポーリングするだけです。

待機する子オブジェクトが複数ある場合 (既に select を使用している場合)、それがWaitForMultipleObjectsコードに適切なモデルであるかどうかを検討することをお勧めします。

于 2012-02-09T19:39:30.280 に答える