我打开一个 FIFO 文件为ifstream
. 一旦创建了对象,线程就会被阻塞,直到我向 FIFO 发送一些东西(这对我来说没问题)。然后我打电话getline()
从流中获取数据。
如何再次读取阻塞线程,直到更多数据写入 FIFO 文件?
谢谢
我打开一个 FIFO 文件为ifstream
. 一旦创建了对象,线程就会被阻塞,直到我向 FIFO 发送一些东西(这对我来说没问题)。然后我打电话getline()
从流中获取数据。
如何再次读取阻塞线程,直到更多数据写入 FIFO 文件?
谢谢
我尚未测试此代码,但我想知道当您读取所有可用数据时,FIFO 是否只是设置 EOF 位。在这种情况下,您可以这样做:
std::ifstream fifo;
std::string line;
bool done = false;
/* code to open your FIFO */
while (!done)
{
while (std::getline(fifo, line))
{
/* do stuff with line */
}
if (fifo.eof())
{
fifo.clear(); // Clear the EOF bit to enable further reading
}
else
{
done = true;
}
}
如果您读取 FIFO 的末尾,请复位并等待更多数据。如果发生错误,您就完成了。我从这个网站得到了这个想法。您可能还必须在执行重置的同一块中关闭并重新打开 FIFO。
提供的getline
函数<string>
返回对流对象的引用。您可以测试此对象的“优点”以查看它是否仍处于打开状态或是否发生错误:
std::ifstream fifo;
std::string line;
/* code to open your FIFO */
while (std::getline(fifo, line))
{
/* do stuff with line */
}
当 FIFO 关闭时,while 测试将返回 false 以退出循环。每次循环迭代都会有效地读取阻塞线程,直到准备好更多数据。
我使用流如下:
ifstream _FifoInStream(_FifoInFileName.c_str(), ifstream::in);
string CmdLine;
while (std::getline(_FifoInStream, CmdLine)) {
cout << CmdLine << endl;
}
仅当我初始化 _FifoInStream 变量即打开流时,我才被阻止。在我将数据发送到 FIFO 之后,我会通过 while 块。我需要的是每次被阻止读取时都无限期地从 FIFO 中读取。