通过ifstream对象阻塞读取FIFO

5

我使用ifstream打开一个FIFO文件。一旦对象创建,线程就会被阻塞,直到我向FIFO发送一些内容(这对我来说没问题)。然后我调用getline()从流中读取数据。

如何再次阻塞线程,直到更多数据被写入FIFO文件?

谢谢

3个回答

4

我还没有测试过这段代码,但我想知道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。


4
这是忙等待吗?当我们重置EOF位时,什么会阻止EOF被重置并使我们不断旋转? - Paul Rubel
你是不是想说 fifo.clear()std::ifstream 似乎没有 reset() 方法。请参考 http://www.cplusplus.com/reference/iostream/ios/clear。 - Adi Shavit
2
没有否定的意思,但是那段代码永远不会停止,就像之前提到的一样(忙等待)。我只想再次强调这一点。 - Martin Meeser

1

<string> 提供的 getline 函数返回流对象的引用。您可以测试此对象的“好处”,以查看它是否仍然打开或是否发生了错误:

std::ifstream fifo;
std::string   line;

/* code to open your FIFO */

while (std::getline(fifo, line))
{
    /* do stuff with line */
}

当FIFO关闭时,while测试将返回false以退出循环。每个循环迭代将有效地读取阻塞线程,直到有更多的数据准备好。


0

我使用流如下:

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,发送数据,然后关闭它。 - user3458
我使用Echo。 - jackhab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接