IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

problème de fifo bloquant sous linux


Sujet :

POSIX C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Points : 26
    Points
    26
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Salut,

    ton programme bloquera tant qu'un autre processus n'aura pas ouvert le pipe en ecriture de l'autre côté... (tu l as ouvert en RD_ONLY, il faut qu'un autre processus l'ouvre en O_WRONLY... )


    ++
    Pouic
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    merci de ta réponse.
    mais j'aurais encore une question. Si je n'ai pas encore ouvert le pipe mais que je me limite à le créer, est-ce qu'un processus peut déjà écrire dedans ou pas?

  4. #4
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par Fonzy007
    merci de ta réponse.
    mais j'aurais encore une question. Si je n'ai pas encore ouvert le pipe mais que je me limite à le créer, est-ce qu'un processus peut déjà écrire dedans ou pas?
    ben non... Il faudra bien qu'il l'ouvre (c'est le meme mecanisme que lorsque tu ecris dans un fichier), et alors, il bloquera comme le cas precedent.

    <edit>
    je n'ai pas testé, mais peut-etre qu'en ouvrant le pipe en lecture et ecriture, il ne bloquera pas... Mais bon, le meilleur moyen de s'en assurer pour toi est de faire des tests
    </edit>

    ++
    Pouic
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    ok je vais tester merci pour ton aide

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 32
    Points : 26
    Points
    26
    Par défaut
    avec une ouverture en lecture/ecriture ca bloque plus

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mai 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 20
    Points : 29
    Points
    29
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de connexion à aMSN sous linux
    Par rufa11 dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 20/09/2008, 02h41
  2. Problème de compilation wxwidgets sous Linux
    Par Zoloom dans le forum wxWidgets
    Réponses: 0
    Dernier message: 12/05/2008, 01h50
  3. Problème TCP non bloquant sous Linux (C++)
    Par jmelyn dans le forum Linux
    Réponses: 4
    Dernier message: 15/11/2007, 14h27
  4. Problème eclipse en français sous Linux
    Par Arthuris dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 04/05/2007, 15h41
  5. Problème de jardinage mémoire sous Linux
    Par Mike29 dans le forum C
    Réponses: 7
    Dernier message: 01/08/2006, 19h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo