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 :

Partage d'une liste chainée entre Processus


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 22
    Points : 16
    Points
    16
    Par défaut Partage d'une liste chainée entre Processus
    Bonjour à tous

    j'ai deux processus dans le premier je construis ma liste chainée et dans le deuxième je dois utilisé cette liste. Est il possible de passé l'adresse du premier élément de cette liste entre les deux pointeurs ?

    Du style : je passe dans la SHM l'adresse du premier élément de cette Liste chainée ?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pour ça, il faut que toute la liste chaînée soit dans la SHM. Par conséquent, tu dois connaître à l'avance la taille maximale de ta liste, pour pouvoir allouer un segment de mémoire partagée assez grand.

    De plus, comme une mémoire partagée n'a pas forcément la même adresse dans les deux processus, tu dois utiliser un adressage relatif. Par exemple, un "tableau chaîné", ou au lieu de pointeurs tu as des indexes dans un tableau de structures chaînons.

    Exemple en pseudocode à venir.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Si je dois allouer une taille max peut être devrais je mieux passé en SHM un tableau de struct ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    De toute façon, ta SHM sera forcément un tableau. Ensuite, l'organisation interne (tableau normal ou tableau chaîné) dépendra des opérations que tu veux faire dessus:
    • Si tu fais des insertions/suppressions fréquentes et que l'ordre est important, il te faudra un tableau chaîné.
    • Si l'ordre n'est pas important, un simple tableau peut faire l'affaire, avec des ajouts uniquement en fin de tableau et la technique du "déplacement du dernier élément" pour les suppressions.

    Code pseudocode : 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
    43
    44
    45
    46
    47
    48
    49
    #Note: En C, la valeur SIZE_MAX est définie dans <limits.h> et vaut (size_t)-1
    DEFINIR IndexNul SIZE_MAX
     
    # Valeurs pour iSuivant:
    #	IndexNul équivaut à NULL
    #	iSuivant pointant sur lui-même indique que la structure n'est pas allouée
    STRUCTURE chainon
    	int uneValeur
    	int uneAutreValeur
    	size_t iSuivant
     
    FONCTION CreerEtInitialiserMemoirePartagee(size_t nElemsMax)
    	chainon[] memoire := CreerMemoirePartagee(nElemsMax * sizeof(chainon))
    	# On fait pointer chaque chainon sur lui-même pour dire "il n'est pas alloué"
    	POUR INDEX i DANS memoire
    		memoire[i] := {0,0, i}
    	RETOUR memoire
     
    FONCTION EstAlloue(chainon[] memoire, size_t i)
    	RETOUR (memoire[i].iSuivant == i)
     
    # Fonction d'allocation "naive" : On peut faire mieux question performance, mais bon...
    FONCTION AllouerChainon(chainon[] memoire)
    	POUR INDEX i DANS memoire
    		SI !EstAlloue(memoire, i)
    			memoire[i].iSuivant := IndexNul
    			RETOUR i
     
    FONCTION DesallouerChainon(chainon[] memoire, size_t i)
    	memoire[i].iSuivant := i
     
     
    #--- fonctions pour la liste chainee---
     
    FONCTION GetDernier(chainon[] memoire, size_t iPremier)
    	SI iPremier==IndexNul OU !EstAlloue(memoire, iPremier)
    		RETOUR IndexNul
    	size_t i := iPremier
    	TANT QUE memoire[i].iSuivant!=IndexNul
    		i := memoire[i].iSuivant
    	RETOUR i
     
    FONCTION AjouterEnFinDeListe(chainon[] memoire, size_t iPremier, int uneValeur, int uneAutreValeur)
    	size_t iDernier := GetDernier(memoire, iPremier)
    	size_t iNouveau := AllouerChainon(memoire)
    	memoire[iNouveau] := {uneValeur, uneAutreValeur, IndexNul}
    	SI iDernier != IndexNul
    		memoire[iDernier].iSuivant := iNouveau
    	RETOUR iNouveau
    PS: Ne pas oublier de verrouiller le tout avec un mutex ou équivalent...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Ok merci. On en peux donc pas partager des zone mémoire processus.

    Peut etre peux tu m'expliquer, j'ai déja vu deux process partager une fonction "callback"
    dans un type client / serveur. Comment le process Serveur pouvez acceder à la callback du process Client

    Merci

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Généralement, ce n'étais pas un vrai partage mais une transmission de données sur le réseau.
    Il y a des protocoles dédiés à cela, comme RPC (Remote Procedure Call)...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    Merci encore !

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Généralement, quand on fait de l'appel de fonctions d'un poste à l'autre (Appel de Procédure Distantes), intervient la notion de marshalling.
    • Le marshalling par valeur correspond à une transmission directe des données. Typiquement, les petites données comme les int sont transmises ainsi.
    • Le marshalling par référence correspond à transmettre un équivalent de pointeur, mais généralement est disponible uniquement pour des objets complexes, puisque pour le manipuler il faut appeler les fonctions associées sur le poste où se trouve vraiment l'objet.

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

Discussions similaires

  1. [CR XI] Partage d'une liste de valeurs entre état et sous-état
    Par EXPE43 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 30/12/2014, 13h01
  2. création d'une liste chainé de processus
    Par katiii dans le forum Général Java
    Réponses: 5
    Dernier message: 07/12/2007, 10h45
  3. Réponses: 2
    Dernier message: 10/10/2005, 02h25
  4. [Stratégie]Sauvegarde d'une liste chainée dans un fichier
    Par BernardT dans le forum Général Java
    Réponses: 17
    Dernier message: 25/07/2005, 17h04
  5. manipulation d'une liste chainé
    Par sorari dans le forum C++
    Réponses: 1
    Dernier message: 16/03/2005, 12h32

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