2

継承したWin32パイプコードの問題を追跡しようとしています。これは、x2とそれに続くx2の古いスタンバイです。CreatePipe()DuplicateHandle()CreateProcess()

    if (!CreatePipe(&child_stdout_read, &parent_write, &security, 0) ||
      !DuplicateHandle(GetCurrentProcess(), parent_write,
      GetCurrentProcess(), &child_stdout_write, 0, TRUE,
      DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE)) {
        throw std::system_error(GetLastError(), std::system_category());
    }

私が混乱しているのは、呼び出しDUPLICATE_CLOSE_SOURCEで使用されているフラグです。DuplicateHandle()Microsoftのドキュメントによると、これは、複製後にソースハンドルが閉じられることを意味します。

(パイプへの)ハンドルのコピーを同じプロセスに作成し、元のハンドルを閉じることのポイントは正確には何でしょうか?オリジナルだけを使ってみませんか?

4

1 に答える 1

4

ええと、キーはTRUEパラメーターにあるように見えます。それが であるBOOL bInheritHandleため、このコードで行うことは、ハンドルを複製して継承可能にすることです。

通常、これは、ハンドルを作成するときに を にsecurity.bInheritHandle設定することで簡単に実行できます。TRUEただし、この場合、両方のハンドルが継承可能になります。そして明らかに、元の作成者は を継承したいだけchild_stdout_writeです。

それほど工夫されていないコードでも同じ効果が得られることに注意してください。

SetHandleInformation(handle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
于 2012-06-29T21:45:18.373 に答える