2009-01-26 6 views
3

J'ouvre un fichier FIFO sous la forme ifstream. Dès que l'objet est créé, le thread est bloqué jusqu'à ce que j'envoie quelque chose dans le FIFO (ce qui est OK pour moi). Puis j'appelle getline() pour obtenir les données du flux.Blocage de la lecture FIFO via l'objet ifstream

Comment bloquer à nouveau le thread jusqu'à ce que plus de données soient écrites dans le fichier FIFO?

Merci

Répondre

3

Je n'ai pas testé ce code mais je me demande si le FIFO est simplement en train de définir le bit EOF lorsque vous lisez toutes les données disponibles. Dans ce cas, vous pourriez être en mesure de le faire:

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 l'extrémité de la FIFO, remise à zéro et attendre d'autres données. Si une erreur s'est produite, vous avez terminé. J'ai eu l'idée pour cela de this website. Vous devrez peut-être également fermer et rouvrir le fichier FIFO dans le même bloc où vous effectuez la réinitialisation.

+3

Est-ce que vous êtes occupé? Lorsque nous réinitialisons le bit EOF, qu'arrête EOF en cours de réinitialisation et nous tourne? –

+0

Ne voulez-vous pas dire fifo.clear() '? 'std :: ifstream' ne semble pas avoir une méthode' reset() '. Voir http://www.cplusplus.com/reference/iostream/ios/clear –

+0

Correction, merci de noter. –

1

La fonction getline fournie par <string> renvoie une référence à l'objet de flux. Vous pouvez tester cet objet pour « bonté » pour voir si elle est encore ouverte ou si une erreur est survenue:

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

/* code to open your FIFO */ 

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

Lorsque le FIFO ferme, le test while retourne false pour sortir de la boucle. Chaque itération de boucle bloquera effectivement le thread en lecture jusqu'à ce que plus de données soient prêtes.

0

J'utilise le flux comme suit:

ifstream _FifoInStream(_FifoInFileName.c_str(), ifstream::in); 

string CmdLine; 

while (std::getline(_FifoInStream, CmdLine)) { 
    cout << CmdLine << endl; 
} 

Je suis bloqué que lorsque j'initialiser la variable _FifoInStream à savoir ouvrir le flux. Après avoir envoyé des données en FIFO je tombe dans le bloc while. Ce dont j'ai besoin, c'est de lire indéfiniment le FIFO à chaque fois qu'on le bloque à la lecture.

+0

Fermez-vous le FIFO après avoir envoyé des données? Par exemple, si vous utilisez la commande echo pour envoyer des données, echo ouvre FIFO, envoie des données, puis le ferme. – Arkadiy

+0

Je fais. L'écho est exactement ce que j'utilise. – jackhab

Questions connexes