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 :

Récupéré structure via un tube nommé


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    fdf
    Inscrit en
    Novembre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : fdf

    Informations forums :
    Inscription : Novembre 2014
    Messages : 20
    Par défaut Récupéré structure via un tube nommé
    Bonjour,

    J'ai une structure req_list contenant :
    un ssize_t
    un tableau de struct requete req[]

    struct requete contient un tableau char args[ARG_SIZE] et ARG_SIZE est un define valent 2048

    Dans le client :

    J,'initialise les champs d' une variable de type req_list j'écris cette variable dans le tube
    avec write(tube, &variable, sizeof(req_list))

    Dans le serveur :
    Ensuite, avant de lire dans le tube je déclare une
    variable dont je vais assigner celle qui a été ecrite dans le tube.

    req_list var2

    Quand je lit dans le tube je fais :
    read(tube, &var2, sizeof(req_list))

    Quand j'affiche les champs de var2
    il n'y a que le ssize_t qui est bien récupéré
    mais un printf de var2. req[i].args affiche des caractères spéciaux genre @ ou ?

    Peut-être que le sizeof(req_list) n'est pas correct dans le read il y a assez pour le ssize_t mais pas pour les chaines args ?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Si la structure ne contient que des sous-structures ou des tableaux, il n'y a aucune raison pour que le sizeof ne fonctionne pas. Attention s'il y a des pointeurs, leur valeur sera transmise mais ils sont inutilisables en réception.
    Les 2 codes doivent utiliser exactement les même définitions et doivent être dans des configurations identiques (p.e pas un en 32 bits et l'autre en 64 bits.), tu peux afficher les 2 sizeof des 2 programmes pour t'en assurer.
    As-tu vérifié la valeur de retour de read()? Il indique combien de bytes ont été reçus. S'il est inférieur à sizeof req_list, il faut refaire un read() (en déplaçant l'adresse de réception et en diminuant la taille attendue du nombre de bytes déjà reçus.)

  3. #3
    Membre averti
    Homme Profil pro
    fdf
    Inscrit en
    Novembre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : fdf

    Informations forums :
    Inscription : Novembre 2014
    Messages : 20
    Par défaut
    Dans le client :
    La variable de type req_list sizeof( vaut 8 bytes
    Le write apres ecriture dans le tube a ecrit 8 bytes
    (%zd)

    Cote serveur :
    Meme chose. sizeof(req_list) = 8 apres le read.
    Et n = read, n vaut 8 apres lecture (%zd)

    Pour infi quand j'affiche apres le write je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i = 0; i < req_list.n; ++i) 
      printf(''%d %s '', i, req_list. list[i]. args) ;

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Il y a quelque chose d'incohérent. Peux-tu donner le détail de la structure, je vois mal comment mettre autant de choses dans une structure qui n'a pas de pointeur et qui ne fait que 8 bytes!

  5. #5
    Membre averti
    Homme Profil pro
    fdf
    Inscrit en
    Novembre 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : fdf

    Informations forums :
    Inscription : Novembre 2014
    Messages : 20
    Par défaut
    typedef enum type_req {
    INFO_USER,
    INFO_PROC,
    INFO_GROUP
    }

    typedef struct requete {
    type_req r; //type de requete
    char args[ARG_SIZE] ; //la requete
    i. e argv[i]
    char cmd[ARG_SIZE] //vaudra '' user'' proc ou group
    char shm[NAME_MAX] //shm corresppndand au pid du client
    char file[NAME_MAX] //chemin acces d' un autre programme

    typedef struct requete_list {
    ssize_t n; //nombre requete (=taille liste des requete)
    requete list[] ; //liste des requete
    }

    Ce que j'essaye de faire c'est recuperer la taille de la liste, pour l'envoyer au read du serveur.
    C'est pour ça que j'ai une structure requete_list qui contient un ssize n
    qui contiendra le nombre de requete
    et dans requete list[] je le remplit avec chaque requete presente dans une autre list(memcpy). J'ai verifie et list[] est bien remplit avec les bonnes requete et leur champ, le soucis c'est que par ex pour 2 requete j'ai 16 bytes (apres le memcpy) et le read me dit qu'il en a ecrit 8 au lieu de 16...

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct requete_list {
    ssize_t n; //nombre requete (=taille liste des requete) 
    requete list[] ; //liste des requete
    }
    Cette notation crée une structure contenant seulement n + un alignement compatible pour y concaténer des requete. Il n'y a aucun tableau dans cette structure (un tableau a toujours une taille explicitement indiquée ou immédiatement calculable)!
    Pour y mettre des données dans list[], il y a quelque part un malloc() pour allouer une structure qui en fait est réalité beaucoup plus grande. n permet de retrouver la taille réellement allouée.
    La structure à récupérer doit elle aussi faire l'allocation pour recevoir toutes ces données (elle ne peut le faire qu'après avoir lu la valeur du champ n), ça ressemblerait à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    size_t n;
    struct requete_list* pReqList = NULL;         // recevra le résultat
     
    size_t nbLus = read( tube , &n , sizeof n );  // lecture du début
    if ( nbLus == sizeof n ) {
        size_t taille = sizeof(struct requette_list) + n * sizeof(requete);
        pReqList = malloc( taille );
        pReqList->n = n;
        nbLus = read( tube , (char*)pReqList + sizeof n , taille - sizeof n );     // lecture du reste
    }

Discussions similaires

  1. Réponses: 10
    Dernier message: 21/01/2014, 22h11
  2. Tubes nommés (named pipes) asynchrones
    Par piziwate dans le forum C
    Réponses: 8
    Dernier message: 18/12/2007, 19h41
  3. Réponses: 6
    Dernier message: 12/09/2007, 15h58
  4. tube nommé en C
    Par yann999 dans le forum POSIX
    Réponses: 7
    Dernier message: 24/11/2006, 11h10
  5. Tube nommé: un casse tête
    Par yashiro dans le forum Linux
    Réponses: 2
    Dernier message: 28/06/2006, 09h11

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