【问题标题】:No bytes in named pipe命名管道中没有字节
【发布时间】:2011-10-21 19:04:27
【问题描述】:

服务: 在命名管道中创建 std out,err,in。将它们附加到它创建的进程。

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)

我已经删除了确保句柄有效并且进程正在运行等的周围代码。

Peek 显示ulRemainingBytes始终 0。有谁看到我的错误可能在哪里?我一直试图让它工作一段时间,并且不知道任何东西的正确标志是什么。如果您需要更多信息,请询问!

CreateNamesPipe 中的安全属性是从方法生成的。它在代码中的许多其他地方都使用过,所以我认为问题不存在。

谢谢。

【问题讨论】:

    标签: c++ winapi named-pipes


    【解决方案1】:

    PeekNamedPipe() 返回应检查的BOOL

    如果失败(FALSE0),请使用GetLastError() 找出原因。

    在此之前,您还应该检查 CreateFile() (hStdOutPide) 与 INVALID_HANDLE_VALUE 的返回值。如果返回的句柄无效,这很可能是PeekNamedPipe() 失败的原因。

    总而言之,您似乎获得了太多(好)的结果。不!检查您的返回码,切勿依赖运气。

    还有一件事:共享标志可能设置不正确。确保它们不会与您想要做的事情发生冲突。无论哪种方式,GetLastError() 都会再次告诉您此类问题,以防CreateFile() 失败。

    【讨论】:

    • 我在 PeekNamedPipe 之后使用 GetLastError() 的 switch case 来处理所有可能的值。我正在对照 INVALID_HANDLE_VALUE 检查 CreateFile 的返回值。感谢您的提示,但如果我有一段时间没有被困在这个问题上,我就不会在 stackoverflow 上发布。
    • @Padawan Learner:你看到了什么错误?因为您描述的行为表明存在错误,而您的代码没有进行足够的错误检查。
    【解决方案2】:

    我怀疑您正在尝试从子进程中的标准输出而不是标准输入中读取。但是从有限的代码中我无法确认这一点。使用管道的 IPC 参考这个问题

    How do I take the output of one program and use it as the input of another on C++?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 2015-04-22
      相关资源
      最近更新 更多