Blocage de lecture depuis FIFO via un objet ifstream
-
20-08-2019 - |
Question
J'ouvre un fichier FIFO en tant que ifstream
. Dès que l'objet est créé, le thread est bloqué jusqu'à ce que j'envoie quelque chose dans la FIFO (ce qui me convient). J'appelle ensuite getline()
pour obtenir les données du flux.
Comment puis-je bloquer à nouveau le fil jusqu'à ce que davantage de données soient écrites dans le fichier FIFO?
Merci
La solution
Je n'ai pas testé ce code, mais je me demande si la FIFO est simplement en train d'activer le bit EOF lorsque vous lisez toutes les données disponibles. Dans ce cas, vous pourrez peut-être faire ceci:
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;
}
}
Si vous lisez la fin de la FIFO, réinitialisez et attendez d'autres données. Si une erreur est survenue, vous avez terminé. J'ai eu cette idée en ce site web . Vous devrez peut-être également fermer et rouvrir la FIFO dans le même bloc que celui où vous effectuez la réinitialisation.
Autres conseils
La fonction getline
fournie par <string>
renvoie une référence à l'objet flux. Vous pouvez tester cet objet pour & Quot; bonté & Quot; pour voir si elle est toujours ouverte ou si une erreur s'est produite:
std::ifstream fifo;
std::string line;
/* code to open your FIFO */
while (std::getline(fifo, line))
{
/* do stuff with line */
}
Lorsque la FIFO se ferme, le test while retournera false pour sortir de la boucle. Chaque itération de boucle lira efficacement le thread jusqu'à ce que plus de données soient prêtes.
J'utilise le flux comme suit:
ifstream _FifoInStream(_FifoInFileName.c_str(), ifstream::in);
string CmdLine;
while (std::getline(_FifoInStream, CmdLine)) {
cout << CmdLine << endl;
}
Je ne suis bloqué que lorsque j'initialise la variable _FifoInStream, c'est-à-dire que j'ouvre le flux. Après avoir envoyé des données dans la FIFO, je tombe dans le bloc while. Ce dont j'ai besoin, c’est de lire indéfiniment dans FIFO à chaque blocage en lecture.