2012-07-05 7 views
0

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.

+0

Pouvez-vous signaler ce que errno est après que open() renvoie et échoue? Cela pourrait donner un indice .... – jwismar

+0

'... (en cas d'échec) -1 est renvoyé et errno contient l'erreur. Quelle est la valeur de retour de' errno'? – Marlon

+0

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

Répondre

2

Supprimez l'indicateur O_NONBLOCK de rouvrir ou si vous souhaitez conserver l'indicateur, connectez-vous à un fifo qui est déjà ouvert pour la lecture. C'est le comportement correct.

http://linux.die.net/man/7/fifo

Un processus peut ouvrir une FIFO en mode non bloquant. Dans ce cas, l'ouverture en lecture seule> réussira même si personne n'a encore ouvert du côté écriture, l'ouverture en écriture seule échouera> avec ENXIO (pas de périphérique ou d'adresse) à moins que l'autre extrémité n'ait déjà été ouverte.

+0

C'est tout !!! Je ne pense même pas à ne pas fermer avant de rouvrir! Je vous remercie! – Daniel