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 : bloquage d'un pipe


Sujet :

POSIX C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2003
    Messages : 25
    Points : 20
    Points
    20
    Par défaut [Resolu] Problème : bloquage d'un pipe
    Bonjour,
    j'écris un programme en c sous linux qui permet à un processus de récupérer la sortie d'un autre via un pipe. Mais, je ne comprend pas au bout d'une cetaine l'affichage s'arrête brusquement. Je me suis aperçu que cet arrêt se produisait lorsque l'affichage atteind une certaine taille.

    Est-ce que un pipe a une durée de vie limité ?

    ou existet-il une autre raison ?

    Merci de répondre à cette question.

    Sébastien Nicaisse.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2003
    Messages : 25
    Points : 20
    Points
    20
    Par défaut Je suis désolé, j'ai oublié un mot
    Il faut lire : Mais, je ne comprend pas au bout d'un cetain temps l'affichage s'arrête brusquement. Je me suis aperçu que cet arrêt se produisait lorsque l'affichage atteind une certaine taille.

    merci de votre compréhensions.

    Sébastien Nicaisse

  3. #3
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    UN pipe n'a pas une durée de vie limitée, juste celle de tes 2 processus. En revanche, il a une taille limitée (provoque un blocage quand il est plein).
    Regarde si ton processus qui écrit ne se termine pas sauvagement, auquel cas tu as un signal BROKEN PIPE d'envoyé avec suppression du pipe.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2003
    Messages : 25
    Points : 20
    Points
    20
    Par défaut Bloquage de pipe
    J'ai vérifié les deux processus fonctionnent. Est-ce que lorsqu'un processus lit une ligne provenant du pipe avec la commande read. Est-ce que cette ligne est effacée de ce même pipe ?

    Et si non, comment l'effacer ?

    Merci de répondre à cette question.

    Sébastien Nicaisse.

  5. #5
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Oui la lecture sur le pipe est destructrice. Peux tu mettre ton code (création/ouverture du pipe, lecture et écriture)?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2003
    Messages : 25
    Points : 20
    Points
    20
    Par défaut voici le code demandé
    int i, tube[2];
    if (pipe(tube) == -1) {
    perror("Ouverture pipe impossible");
    exit(1);
    }
    i=fork();

    if (i==0) {
    /* process fils */
    printf("on lance mpirun.\n");
    close(1); /* fermeture sortie std */
    dup2(tube[1], 1); /* redirection sortie std sur descripteur en ecriture du tube */
    close(tube[0]); /* fermeture du descripteur inutilise */
    execvp("mpirun", array_controls);
    free(control);
    // execlp("ls", "ls", NULL);
    perror("Lancement de mpirun");
    }

    else {
    int n;
    char ch[1024];
    /* process pere */
    close (tube[1]);
    while((n = read(tube[0], ch, 1023))) {
    // fscanf(in,"%s", ch); // lecture du tube
    ch[n] = 0;
    send(new_fd, ch, n, 0);
    recv(new_fd, ch, 4, 0);
    printf("%s", ch);
    fflush(0);
    }
    system("sleep 1");
    send(new_fd, "finish", 6, 0);
    recv(new_fd, ch, 4, 0);
    // fclose(in);
    }

  7. #7
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Ton post de code a disparu... C'est vrai que :
    1- il aurait du être à la suite de celui ci
    2- les balises code sont entre crochets!!!
    Bon, je le colle ici:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    int i, tube[2]; 
    if (pipe(tube) == -1) { 
    perror("Ouverture pipe impossible"); 
    exit(1); 
    } 
    i=fork(); 
     
    if (i==0) { 
    /* process fils */ 
    printf("on lance mpirun.\n"); 
    close(1); /* fermeture sortie std */ 
    dup2(tube[1], 1); /* redirection sortie std sur descripteur en ecriture du tube */ 
    close(tube[0]); /* fermeture du descripteur inutilise */ 
    execvp("mpirun", array_controls); 
    free(control); 
    // execlp("ls", "ls", NULL); 
    perror("Lancement de mpirun"); 
    } 
     
    else { 
    int n; 
    char ch[1024]; 
    /* process pere */ 
    close (tube[1]); 
    while((n = read(tube[0], ch, 1023))) { 
    // fscanf(in,"%s", ch); // lecture du tube 
    ch[n] = 0; 
    send(new_fd, ch, n, 0); 
    recv(new_fd, ch, 4, 0); 
    printf("%s", ch); 
    fflush(0); 
    } 
    system("sleep 1"); 
    send(new_fd, "finish", 6, 0); 
    recv(new_fd, ch, 4, 0); 
    // fclose(in); 
    }
    1- Je te conseille de faire afficher au fur et à mesure le nb de fois ou tu lis dans le tube et la valeur de n
    2- Es tu sur que ce n'est pas le recv() qui bloque dans ta boucle????

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2003
    Messages : 25
    Points : 20
    Points
    20
    Par défaut
    Non, j'ai ajouté un printf avant le send et le recv. Le pipe se bloque au plein milieux d'un affichage.

    merci de répondre à cette question.

    Sébastien Nicaisse.

  9. #9
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Je viens de voir quelque chose dans le code du process fils. Tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    close(1);
    dup2(tube[1], 1);
    Il faut supprimer le close car dup2 le fait déjà, ou alors, faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    close(1);
    dup(tube[1]);
    Mais je ne vois pas pourquoi ca marcherait un certain temps... Enfin, fait quand même la modif, ca sera plus propre.
    C'est donc le read() qui se bloque...
    Peux tu t'assurer que ton programme mpirun continue à écrire? As tu affiché autant de choses qui ont été écrites?
    Il faut que tu mettes un maximum de traces car là, je ne vois pas du tout.
    Et modifies aussi la condition de ton while, car si read() renvoie -1 (erreur), tu ne le verras pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while((n = read(tube[0], ch, 1023))>0) {

  10. #10
    Membre à l'essai
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2003
    Messages : 25
    Points : 20
    Points
    20
    Par défaut [Resolu] Probléme : bloquage de pipe
    Merci, joellel de m'avoir ouvert les yeux. Le problème provenait de mon client qui attendait 99 caractère alors que mon server en envoyer 1023.

    A propos de la présentation du code source, je ne comprend pas, j'ai tenté de le mettre entre la balise <code> MON code </code>, mais ça ne fonctionne pas.

    Sébastien Nicaisse.

  11. #11
    Membre averti
    Avatar de joellel
    Profil pro
    Inscrit en
    Février 2003
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2003
    Messages : 234
    Points : 338
    Points
    338
    Par défaut
    Les balises, c'est entre [ ] et non < >

    Maintenant l'étape suivante dans l'utilisation du forum c'est de marquer le thread RESOLU!!!
    - Tu édites ton 1er message
    - Tu modifies le titre en écrivant devant: [RESOLU]

    Et voilà
    A la prochaine !

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

Discussions similaires

  1. Problème avec les fonctions pipe et dup
    Par Bifurkk dans le forum C
    Réponses: 1
    Dernier message: 03/12/2011, 10h27
  2. problème bloquage Windows XP
    Par yasinfo dans le forum Windows XP
    Réponses: 9
    Dernier message: 19/10/2011, 18h19
  3. GraceGTK : problème de gestion de "pipe"
    Par pvincent dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 03/03/2010, 14h16
  4. Problème de relais brisé (pipe)
    Par tomtom59 dans le forum Langage
    Réponses: 5
    Dernier message: 12/03/2008, 11h46
  5. [ServerSocket] Problème de bloquage sur readLine()
    Par thomaswilliamson dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 15/03/2005, 11h15

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