3

私は無名パイプを使用して通信する2つの短いプログラムを作成しました。親プロセスは、子の標準IOハンドルを設定することにより、パイプハンドルを共有します。

// -- Set STARTUPINFO for the spawned process -------------------------
ZeroMemory(&m_ChildSI, sizeof(STARTUPINFO));
GetStartupInfo(&m_ChildSI);

m_ChildSI.dwFlags       = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
m_ChildSI.wShowWindow   = SW_HIDE;
m_ChildSI.hStdError     = m_pipeChild.WritePipeHandle();
m_ChildSI.hStdOutput    = m_pipeChild.WritePipeHandle();
m_ChildSI.hStdInput     = m_pipeParent.ReadPipeHandle();

子は、 GetStdHandleの呼び出しで読み取りパイプハンドルを取得します。

hReadPipe = GetStdHandle(STD_INPUT_HANDLE)

私の質問は、パイプハンドルは、親と子が通信を終了すると、それらに対してCloseHandle ()を呼び出す親プロセスによって作成されます。

子供もCloseHandle()を呼び出す必要がありますか?これらは標準のIOハンドルであるため、プロセスが折りたたまれたときに自動的に割り当てが解除されると考えていました。

ありがとう!

4

3 に答える 3

3

Win32では、パイプなどのカーネルオブジェクトは、1つ以上のユーザーモードハンドルによる参照です。すべてのハンドルを閉じると、基になるオブジェクトを閉じることができます。

各プロセスのハンドルは、同じ値を持ち、同じオブジェクトを参照する場合がありますが、異なるハンドルであるため、個別に閉じる必要があります。

于 2010-08-19T14:30:02.323 に答える
1

私はMSDNのドキュメントPipeHandleInheritanceを読んだばかりです。

「子供がパイプを使い終わったら、CloseHandleを呼び出すか、終了することによってパイプハンドルを閉じる必要があります。これにより、ハンドルが自動的に閉じられます。」

于 2010-08-19T13:24:42.187 に答える
0

アプリケーションの終了時にハンドルを閉じないでおくことができます。Windowsは自動的にリソースを解放します。ただし、すべてが論理的で一貫性があるように、手動で閉じることをお勧めします。ハンドルを開いたままにしておくと、コードを再利用または最新化するときにバグやリークが発生する可能性があります。

于 2010-08-19T14:18:56.423 に答える