命名管道中没有字节

时间:2011-10-21 19:04:28

标签: c++ winapi named-pipes

服务: 在命名管道中创建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)

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

The Peek透露ulRemainingBytes 始终 0。有谁看到我的错误可能在哪里?我一直试图让它工作一段时间,并且不知道什么是适当的标志。请询问您是否需要更多信息!

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

感谢。

2 个答案:

答案 0 :(得分:1)

PeekNamedPipe()会返回应该检查的BOOL

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

在此之前,您还应该针对CreateFile()检查hStdOutPideINVALID_HANDLE_VALUE)的返回值。如果返回的句柄无效,则可能是PeekNamedPipe()失败的原因。

总而言之,你似乎采取了太多(好)的结果。别!检查您的退货代码,不要依赖运气。

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

答案 1 :(得分:0)

我怀疑你是在尝试从stdout读取而不是stdin在你的子进程中。但是从有限的代码我无法证实这一点。有关IPC使用管道的信息,请参阅此问题

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