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

C Discussion :

Pipe, fork & Select


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Par défaut Pipe, fork & Select
    Bonjour,

    je dois faire un programme qui contient deux processus qui communiquent via des pipes. Le processus fils doit à la fois pouvoir lire sur un pipe et écrire sur un autre. Concrètement le fils doit envoyer une commande au père, qui l'exécute et écrit le résultat sur un autre pipe, puis le fils doit de nouveau lire sur l'autre pipe le résultat pour l'afficher. Pour cela j'utilise select() de cette façon:

    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
    pipe(pr);
    pipe(pw);
    ...
    fd_set r_fdset, w_fdset;
    FD_ZERO(&r_fdset);
    FD_ZERO(&w_fdset);
    FD_SET(pr[1], &w_fdset);
    FD_SET(pw[0], &r_fdset);
     
    max = (pr[1] > pw[0]) ? pr[1] : pw[0];
     
    while(1) {
        state = select(max+1, &r_fdset, &w_fdset, NULL, NULL);
     
        if(state == -1) perror("select");
        else if(state > 0) {
     
            if (FD_ISSET(pr[1], &w_fdset)) {
                printf("Ecriture\n");
            }
     
            if (FD_ISSET(pw[0], &r_fdset)) {
                printf("Lecture\n");
            }
        } else {
            printf("Rien\n");
        }
    }
     
    ...
    Le problème que j'ai est que le select() ne retourne jamais avec la lecture possible sur pw[0]. J'ai essayé beaucoup de chose mais j'obtiens toujours un Bad file descriptor.

    Merci pour voter aide.

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salut,

    as-tu ouvert les deux pipes en lecture et en écriture (c'est obligatoire, même si tu n'utilises qu'un bout) dans le père et le fils ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Par défaut
    La fonction pipe() ouvre les deux pipes avant le fork(). Pour l'instant je ferme aucune des extrémités du pipe que ce soit dans le père ou dans le fils.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Tu ne teste pas la valeur de retour de certaines fonctions (comme int pipe(int [2]) ).

    Ensuite, je ne suis pas sûr, mais select peut-il regarder deux tubes à la fois?
    Je dois avouer que je n'ai jamais eu à l'utiliser.

  5. #5
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    voici un example, mais en utilisant la methode poll():

    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
    39
    40
    41
    42
     
    #include <stdio.h>
    #include <fcntl.h>
    #include <poll.h>
    #define MAX_BUFF_SIZE 128
     
    int main(void){
        char buff[MAX_BUFF_SIZE + 1];
        char *buf = NULL;
        int fd = -1;
        int ret = -1;
        int len = 0;
        struct pollfd fdinfo[1];
     
        if((fd = open("/home/s/pipe", O_RDONLY)) == NULL) {
            printf("Error Opening File.\n");
            exit(1);
        }
     
        fdinfo[0].fd = fd;
        fdinfo[0].events = POLLIN|POLLPRI ;
     
        while(1)
        {
            ret = poll(fdinfo,1,-1);
            if (ret < 0) printf("\n\r error");
     
            if ( ((fdinfo[0].revents&POLLIN) == POLLIN) || ((fdinfo[0].revents&POLLPRI) == POLLPRI) )
            {
                len = read(fdinfo[0].fd, buff, MAX_BUFF_SIZE);
                if (len > 0){
                    buff[len] = '\0';
                    buf = (char *) calloc(1, len+1);
                    memcpy(buf, buff, len);
                    printf("\n read len %d\n %s",len, buf);
                    free(buf);
                 }
            }
     
        }
        return 0;
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Par défaut
    En réalité je test la sortie de la fonction pipe. Mais pour plus de simplicité je ne l'ai pas mis dans le poste.

    Pour ce qui est de la fonction poll(), je suis contraint d'utiliser select() :/

    Merci

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

Discussions similaires

  1. probleme de pipe + fork
    Par jerem721 dans le forum C
    Réponses: 0
    Dernier message: 12/02/2011, 22h48
  2. problème chat avec socket/fork/pipe
    Par cedricdd dans le forum Réseau
    Réponses: 10
    Dernier message: 08/03/2007, 14h56
  3. Fork et pipe
    Par Ylias dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 30/05/2006, 09h13
  4. Réponses: 1
    Dernier message: 07/04/2006, 13h35
  5. [PERL] Problème en essayant de comprendre fork et pipe
    Par LE NEINDRE dans le forum Langage
    Réponses: 6
    Dernier message: 04/10/2005, 15h23

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