problème de fifo bloquant sous linux
slt,
j'ai un problème avec des fifo. j'essaye d'ouvrir un fifo en mode bloquant dans une fonction. dans une autre fonction, je ferai un while(true) dans lequel il y aura la lecture du fifo et traitement des données.
Le problème est que mon programme bloque lors de l'ouverture (le fifo est bien créé car status vaut 0). Voici le code de la fonction qui permet l'ouverture du fifo.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
void createAndOpenFifo(){
pathfifo = malloc(sizeof(char)*7+sizeof(pid_t));
int status = mkfifo(pathfifo,0666);
if(status<0){
perror("It's impossible to create a fifo.");
exit(EXIT_FAILURE);
}
if((fifo=open(pathfifo,O_RDONLY))<0){
perror("Error while opening the fifo.");
exit(EXIT_FAILURE);
}
} |
Est-ce que quelqu'un a une idée du problème et du moyen de le résoudre?
Merci d'avance ;)
Note: le fifo doit etre bloquant pour la lecture car les données viennent d'un autre processus et que fatalement on ne peut pas etre certain que le fifo soit tjs plein
read a pipe in C++ with fstream or ifstream
Bonjour tout le monde,
Je repond a ce probleme bien que celui-ci soit resolu. Je repond pour donner une alternative qui n'est pas souvent decrite : Ecrire ou lire des named pipes sous linux/unix en C++ en utilisant les fstream, ifstream, ofstream plutot que les fonctions C traditionnelles dont les exemples ne manquent pas sur la toile :
Le programme :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
int main(int argc, char** argv)
{
int i = 0;
std::fstream input_pipe("thePipe.pipe");
std::string strInput;
for(;;)
{
input_pipe >> strInput;
std::cout << "pipe read = < " << strInput << ">" << std::endl;
}
return 0;
} |
--> compiler, le programme s'appelle echoPipe
--> Dans le 1er terminal faire :
> cd /tmp/
> mkfifo thePipe.pipe
> echoPipe < thePipe.pipe
--> Dans le 2er terminal faire :
> cd /tmp/
> echo "uneLongueChaineIciAEnvoyerDansLePipeNomme" > thePipe.pipe
> echo "uneAutreChaine" > thePipe.pipe
--> Observez la sortie sur le terminal 1 :
> read Pipe = <uneLongueChaineIciAEnvoyerDansLePipeNomme>
> read Pipe = <uneAutreChaine>
--> Note speciale :
Ici la lecture est bloquante. Changez le type de input_pipe : Utilisez ifstream plutot que fstream et vous aurez une lecture non bloquante. Neanmoins les nouvelles donnees ne seront pas lues ce qui oblige a fermer le pipe et le reouvrir (ou bien flusher... j'ai pas teste).
Bonnes decouvertes !