我打开一个FIFO文件为ifstream
。只要对象被创建,线程就会被阻塞,直到我发送一些东西进入FIFO(这对我来说没问题)。然后我打电话getline()
从流中获取数据。通过ifstream对象阻止从FIFO读取
如何再次读取阻塞线程,直到更多数据写入FIFO文件?
由于
我打开一个FIFO文件为ifstream
。只要对象被创建,线程就会被阻塞,直到我发送一些东西进入FIFO(这对我来说没问题)。然后我打电话getline()
从流中获取数据。通过ifstream对象阻止从FIFO读取
如何再次读取阻塞线程,直到更多数据写入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的末尾,请重置并等待更多数据。如果发生错误,您就完成了。我从this website得到了这个想法。您可能还必须关闭并在重置的同一个块中重新打开FIFO。
由<string>
提供的getline
函数返回流对象的引用。您可以测试这个对象的“善”,看它是否仍然是开放的,或者如果发生错误:
std::ifstream fifo;
std::string line;
/* code to open your FIFO */
while (std::getline(fifo, line))
{
/* do stuff with line */
}
当FIFO关闭时,而测试将返回false退出循环。每循环迭代将有效地读取阻塞线程,直到更多数据准备就绪。
我使用流如下:
ifstream _FifoInStream(_FifoInFileName.c_str(), ifstream::in);
string CmdLine;
while (std::getline(_FifoInStream, CmdLine)) {
cout << CmdLine << endl;
}
我阻塞只有当我初始化_FifoInStream变量即打开该流。在将数据发送到FIFO后,我通过while块。我需要的是每次读取时都无限期地从FIFO读取数据。
发送数据后关闭FIFO吗?例如,如果你使用echo命令发送数据,echo会打开FIFO,发送数据并关闭它。我做的是 – Arkadiy 2009-01-27 15:55:09
。回声正是我使用的。 – jackhab 2009-01-29 13:15:26