簡體   English   中英

命名管道中沒有字節

[英]No bytes in named pipe

服務:在命名管道中創建std out,err。 將它們附加到它創建的過程。

HANDLE hStdOut = CreateNamedPipe(szStdOutPipeName,
            PIPE_ACCESS_DUPLEX,
            PIPE_TYPE_BYTE,
            1,
            100,
            100,
            15000,
            pSa);
yStartupInfo.hStdOutput = hStdOut;
CreateProcessAsUserW( ..., yStartupInfo, ... );

這部分有效。 創建的進程的輸出將被重定向到管道中。

客戶端:連接到命名管道,成功。 偷看一下是否有字節要讀取(這時將字節推入管道!)。 然后從管道讀取字節。

hStdOutPide = CreateFileW(szPipeNameStdOut,
                          GENERIC_READ|GENERIC_WRITE,
                          FILE_SHARE_READ|FILE_SHARE_WRITE,
                          NULL, 
                          OPEN_EXISTING, 
                          0, 
                          NULL );
PeekNamedPipe(hStdOutPide,
              szBuffer,
              kunBufferSize,
              &ulBytesRead,
              &ulBytesAvailable,
              &ulRemainingBytes);
if( ulBytesAvailable > 0)
      ReadFile(hStdOutPide, szBuffer, 1000, &ulBytesRead, NULL)

我刪除了周圍的代碼,以確保句柄有效並且進程正在運行等等。

窺視顯示ulRemainingBytes 始終為 0 有人看到我的錯誤可能在哪里嗎? 我一直在努力使它工作一段時間,並且不知道什么合適的標志了。 請詢問您是否需要更多信息!

CreateNamesPipe中的安全屬性是從方法生成的。 它在代碼中的許多其他地方都使用過,所以我不認為問題出在那。

謝謝。

PeekNamedPipe()返回應該檢查的BOOL

如果失敗( FALSE0 ),請使用GetLastError()找出原因。

在此之前,您還應該對照INVALID_HANDLE_VALUE檢查CreateFile()hStdOutPide )的返回值。 如果返回的句柄無效,則很可能是PeekNamedPipe()失敗的原因。

總而言之,您似乎獲得了太多(好)結果。 別! 檢查您的返回碼,永遠不要依靠運氣。

只是一件事:共享標志設置有可能不正確。 確保它們不與您要執行的操作沖突。 無論哪種方式,如果CreateFile()失敗, GetLastError()都會再次告訴您有關此類問題的信息。

我懷疑您是在嘗試從子進程讀取stdout而不是stdin。 但是從有限的代碼我無法確認這一點。 有關使用管道的IPC,請參閱此問題

如何在C ++上將一個程序的輸出用作另一個程序的輸入?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM