0

Windows (MinGW) で、プログラムが呼び出しプロセスから不要なハンドルを継承しています。

プロセスはこれらのファイルを開く必要はありませんが、親の存続期間を超えて存続するため、ファイルが開いたままになるという通常の問題が発生します。

Linux では、次のように問題を修正します。

// Close all file descriptors
// It's hard to figure out how many are open, but the first 1000 should do
int fd;
for (fd = 0; fd < 1000; fd++)
  close (fd);

これは、Windows では機能しないようです。

どのファイル ハンドルが継承されているかを確認するにはどうすればよいですか? どうすればそれらを閉じることができますか?

このプロジェクトは、MinGW と Windows の Unix 互換 API を使用して C (C++ ではない) で書かれています。

4

2 に答える 2

1

これをいくらか調査したところ、実際の問題の解決策が見つかりましたが、意図した方法ではありませんでした。

望ましくない開いているファイルを見つけてクリーンアップできると思っていましたが、これは難しいことがわかりました。これを行う方法についていくつかの異なるチュートリアル ( hereおよびhere ) を見つけましたが、それらは文書化されていないAPIに依存しています。私はこの手法を機能させることができませんでした。おそらく、やり方が間違っていたか、Windows Server 2012 で API が変更された可能性があります。Sysinternals がこのようなことを追跡し、Process Explorer を動作させ続けることは問題ありませんが、プロジェクトにそのメンテナンスの負担を負わせたくありません。

私は今2つの選択肢があります:

  1. 必要に応じて、親 (呼び出し側) プロセスに特別なケースのコードを入れてCreateProcess、継承を無効にして呼び出すようにします (現在、Unix スタイルのパイプとファイル ハンドルと互換性があり、それらを非常に確実に_spawnlp使用できないため、これを使用しています)。 CreateProcess.

  2. CreateProcess不要なハンドルを強制終了するために、プロセスにすぐに自分自身を呼び出してから終了 (または無期限に待機) させます。

最初はより効率的だと感じます。2 つ目は、より柔軟です (プロセス自体が選択できるようになります)。

オプション 1 を選択すると思います。現在のニーズでは、それが最も悪いとは思えないからです。

于 2013-09-16T11:41:12.150 に答える