J'utilise FIFO pour IPC. Cependant, ils effectuent un comportement étrange. En ce qui concerne la démostration, je poste ici du code qui peut être compilé et exécuté. Informations supplémentaires, je suis sous Linux Ubuntu, avec le compilateur g ++ de base livré avec, rien de spécial.C++ FIFO comportement étrange
#include <iostream>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <iostream>
using namespace std;
int main() {
cout << "START" << endl;
int fifo;
int code;
mkfifo("/tmp/FIFO", 666);
if ((fifo = open("/tmp/FIFO", O_RDONLY | O_NONBLOCK)) < 0) {
perror("open failed");
}
else {
cout << "open successed" << endl;
code = close(fifo);
cout << "close: " << code << endl;
if ((fifo = open("/tmp/FIFO", O_WRONLY | O_NONBLOCK)) < 0) {
perror("reopen failed");
}
else {
cout << "reopen successed" << endl;
code = close(fifo);
cout << "close: " << code << endl;
}
}
cout << "END" << endl;
return 0;
}
Mon attente de la sortie est quelque chose comme ça, depuis que je le ferme avec succès:
START
open successed
close: 0
reopen successed
close: 0
END
Cependant, je suis arrivé cette deuxième ouverture échoue. Pourquoi? Et pourquoi avec ce message d'erreur stupide?
START
open successed
close: 0
reopen failed: No such device or address
END
Je voudrais vraiment rouvrir le FIFO pour écrire. Et j'aimerais savoir la raison pour laquelle le code ci-dessus ne fonctionne pas.
Pouvez-vous signaler ce que errno est après que open() renvoie et échoue? Cela pourrait donner un indice .... – jwismar
'... (en cas d'échec) -1 est renvoyé et errno contient l'erreur. Quelle est la valeur de retour de' errno'? – Marlon
En fait, je ne connais pas la valeur exacte, mais nous n'en avons pas besoin puisque perror imprime le message à la place du code. ("Aucun appareil ou adresse"). – Daniel