我打開一個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