c++ - WriteFile/ReadFile 死锁

标签 c++ file-io pipe named-pipes

我正在使用管道,但在 WriteFile/ReadFile 上遇到了一种死锁。这是我的代码:

hProbePipeRet = CreateNamedPipe( 
          "\\\\.\\pipe\\probePipeRet", // pipe name 
          PIPE_ACCESS_DUPLEX,       // read/write access 
          PIPE_TYPE_MESSAGE |       // message type pipe 
          PIPE_READMODE_MESSAGE |   // message-read mode 
          PIPE_WAIT,                // blocking mode 
          PIPE_UNLIMITED_INSTANCES, // max. instances  
          BUFSIZE,                  // output buffer size 
          BUFSIZE,                  // input buffer size 
          5,                        // client time-out 
          NULL);                    // default security attribute 

首先我创建了我的管道,然后我在另一个应用程序中像这样使用它:

WriteFile( 
            hProbePipeRet,        // handle to pipe 
            msg.c_str(),     // buffer to write from 
            msg.size(), // number of bytes to write 
            &dwBytesWritten,   // number of bytes written 
            NULL);        // not overlapped I/O 

然后我收到它:

        fSuccess = ReadFile( 
            myInst->hProbePipeRet,        // handle to pipe 
            buf,    // buffer to receive data 
            BUFSIZE, // size of buffer 
            &dwBytesRead, // number of bytes read 
            NULL);        // not overlapped I/O 

这是非常基本的,我还有两个管道做完全相同的事情,唯一的区别是它们在不同的线程中,但我只需要这个用于消息的基本事务处理。

第一次尝试时,管道上的信息被成功读取,但第二次尝试时,如果我不发送至少 BUFSIZE 的数据,WriteFile 和 ReadFile 都会阻塞。正如我所说,我还有两个管道做同样的事情,具有相同的功能,而且我不需要发送 BUFSIZE 的数据来进行成功的通信。

编辑:附加信息

执行过程如下:一条消息通过 pipe1 发送到服务器,消息被接收,然后它在我有问题的代码中使用 hProbePipeRet 返回数据。数据由客户端读取,打印到屏幕上。

另一条消息使用 pipe1 发送,收到,结果再次进入 hProbePipeRet,客户端正在等待至少 BUFSIZE 的信息,我不知道服务器在做什么,但它在 WriteFile 处被阻止。

这种情况与我的其他管道相同,但我没有将 hProbePipeRet 放在单独的线程中以从中读取。我这样做是因为我需要在发送消息后立即得到答复。

最佳答案

也许您遇到了使用阻塞 IO 的问题。对 ReadFile 的调用会阻塞,直到有内容可读为止。如果您有一个先调用写入然后读取的循环,它可能会在第二次调用时阻塞。 也许你应该考虑使用异步 io。您使用事件调用 readFile。当有内容可读时,事件就会被设置。所以不需要创建多线程。

关于c++ - WriteFile/ReadFile 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7763958/

相关文章:

php - 文件或数据库用于快速读取、不频繁更新/插入?

database - 如何在 R 中读取 MNIST 数据库?

objective-c - 如何使用 Cocoa 创建临时文件?

c - 打开一个具有完整功能的 cmd 程序 (i/o)

带有循环和管道的 bash 函数

c++ - 如何捕获 QSystemTrayIcon 退出事件?

C++:在 MSVC 2010 中使用 #if std::is_fundamental<T>::value 进行条件编译

c++ - 英特尔 C++ 编译器将对象中的 vptr(指向虚函数表的指针)存储在哪里?

c++ - CTF Reader 对 CNTK 中的大文件抛出错误

bash - bash 与 zsh 中的重定向和管道行为