tableau de chaines en mémoire partagé (Linux/POSIX) [RESOLU] - C - Programmation
Marsh Posté le 18-05-2007 à 13:41:24
for (i=0;i<NMAXCLI;i++) strcpy(pcSegMemPseudo [i], toto) ;
pcSegMemPseudo [i] ne sont pas initialisés.
Marsh Posté le 18-05-2007 à 13:55:45
shmget renvoi un entier qui identifie le segment de mémoire partagé.
comment initialiser pcSegMemPseudo [i] ?
J'ai vu des exemples de création de tableaux à 2 dimensions mais à chaque fois il étais associés à des malloc(), ici je pense avoir alloué toute la mémoire nécessaire pour mon tableau (âpres peut être que je mélange tout).
Je suis d'accord pour dire qu'il manque quelque chose pour définir la structure de mon tableau mais je ne sais pas comment m'y prendre.
Marsh Posté le 18-05-2007 à 14:37:02
misterpatate a écrit : shmget renvoi un entier qui identifie le segment de mémoire partagé. |
surtout en cas d'erreur ...
misterpatate a écrit : |
Tu mélanges tout. Apprend d'abord à le faire avec malloc.
Marsh Posté le 18-05-2007 à 15:08:25
Taz a écrit : |
pour ce code j'ai bien en retours mon identifiant de segment partagé (vérifié avec strace )
mais en cas d'erreur il renvoi -1
Taz a écrit : |
Je sais, c'est bien le problème mentionné en introduction.
Taz a écrit : |
J'ai déjà abordé toutes les méthodes de création de tableau de chaines avec plusieurs tutoriels, cependant je n'ai réussi à appliquer aucune d'elles avec mon espace mémoire partagé, c'est pour cela que je pose la question pour ce cas précis.
comment ferais tu ?
Marsh Posté le 18-05-2007 à 16:09:28
Je ferais pareil qu'avec malloc. Ou alors une allocation en une seule fois. Tout pareil qu'avec malloc. Aucune différence de qui te fournit un emplacement libre.
Marsh Posté le 20-05-2007 à 14:00:19
misterpatate a écrit : J'ai déjà abordé toutes les méthodes de création de tableau de chaines avec plusieurs tutoriels, cependant je n'ai réussi à appliquer aucune d'elles avec mon espace mémoire partagé, c'est pour cela que je pose la question pour ce cas précis. |
Comme le dit Taz, si tu sais le faire avec malloc (qui te renvoie un pointeur sur une zone d'octets alloués en mémoire), tu sais le faire avec shmat (qui te renvoie un pointeur sur une zone d'octets alloués en mémoire partagée)
misterpatate a écrit :
|
A mon avis, l'erreur vient de la ligne 51. Tu copies ton pseudo dans "pcSegMemPseudo[i]" qui n'est pas une chaîne de caractères mais un simple pointeur. Total, lors de l'itération suivante, le pseudo suivant est copié dans l'adresse qui est juste à coté et non celle qui est au début de la string suivante
Ex: Ta zone commence à l'adresse "0x1000". Tu itères ta copie de "toto". Tu aimerais avoir
Mais comme tu ne travailles qu'avec des pointeurs, tu as en fait
Pour t'en sortir, soit tu fais toi-même les calculs de positionnement corrects dans le gros tableau de char "pcSegMemPseudo", soit tu travailles avec des tableaux de strings (en utilisant LONGPSEUDO)
Marsh Posté le 20-05-2007 à 17:28:01
merci pour ces indications, j'ai ainsi pue obtenir un code fonctionnel que voici :
Code :
|
Marsh Posté le 20-05-2007 à 17:40:50
Oui. Tu peux éviter d'avoir 3 clefs distinctes et n'en utiliser qu'une seule en gérant bien le positionnement dans ta shm.
Sinon il me semble que la seconde valeur de ftok() ne doit pas être égale à 0 donc ta ligne 37 devrait merder...
Moi, quand je fais du ftok, j'utilise "." comme nom de fichier et getuid() comme second paramètre. Ca permet donc d'avoir des clefs différentes suivant
Et permet aussi d'avoir la même clef si les paramètres sont identiques
Code :
|
Marsh Posté le 20-05-2007 à 18:18:21
merci pour ces précisions.
j'utilise la valeur 0 pour ftok depuis pas mal de temps et ça ne semble pas poser de problème.
Marsh Posté le 20-05-2007 à 18:53:46
misterpatate a écrit : j'utilise la valeur 0 pour ftok depuis pas mal de temps et ça ne semble pas poser de problème. |
Faudra que je vérifie. Un des man ne dit rien sur ça (http://www.linux-kheops.com/doc/ma [...] tok.3.html) mais l'autre le précise (http://man.cx/ftok(3)/fr)
Mais une chose est certaine => ftok associe les bits à "1" de la valeur avec les bits de poids faibles du n° d'inode du fichier qu'on lui donne. Donc une valeur à 0 ne sert à rien...
Sinon moi j'aurais créé une grosse structure pour gérer tout le projet (elle contient les pseudos et tout le reste) puis j'aurais benné ma structure d'un coup en shm via un bon gros memcpy bien bestial. A voir...
Marsh Posté le 21-05-2007 à 00:08:07
bof, c'est très très compliqué ton truc. Il faut réfléchir un peu des fois. Une méthode plus simple et plus efficace et demandant moins de mémoire est (exemple avec malloc) :
Code :
|
Et voilà !
Marsh Posté le 21-05-2007 à 00:12:18
et d'ailleurs dans ton histoire, ou toutes les dimensions du tableau sont connus, c'est encore plus simple
Code :
|
et donc tu fais le tout en une seule allocation, un seul segment
Marsh Posté le 25-05-2007 à 18:57:59
misterpatate a écrit : j'utilise la valeur 0 pour ftok depuis pas mal de temps et ça ne semble pas poser de problème. |
J'ai regardé aujourd'hui au bureau (j'avais un peu zappé le truc puis je m'en suis rappelé).
Donc dans un premier temps, ftok(..., 0) a marché (il m'a renvoyé une valeur qui n'était pas "-1" ). Mais en lisant attentivement le man, c'était écrit explicitement "...utiliser une valeur à 0 provoque un comportement indéfini" => c.a.d. que ça peut très bien fonctionner 12 fois et planter à la 13°...
http://man.developpez.com/man3/ftok.3.php
Marsh Posté le 25-05-2007 à 21:35:35
merci pour cette précision qui explique probablement quelques plantages lors de mes test
Marsh Posté le 18-05-2007 à 12:29:08
Bonjour à tous
J'en appel au programmeurs c pour qui l'algèbre des pointeurs n'a plus de secrets
Pour un devoirs je doit réaliser un tchat, sous Linux, qui utilise les IPC, Sémaphores et mémoire partagé pour communiquer, jusque la, pas de problème. mais lorsqu'il s'agit de stocker la liste des pseudo des connectés à mon tchat, impossible de réaliser un code qui fonctionne. J'ai déjà codé en C il y a quelques années mais la, impossible de trouver la bonne combinaison de *,&, **truc et autres *(char)(truc[i]) qui fonctionne , je deviens fou.
Ce que je souhaite faire : un tableau qui stocke la liste des surnom de mes utilisateurs, qui sera en mémoire partagé.
Je vous donne le code que j'ai déja réalisé mais sur lequel je n'arrive pas à travailler sans provoquer un "segmentation fault"
un fichier key doit etre créer (touche key) pour permetre la génération des clés pour identifier les sémaphores et segment partagés.
une fois compilé, il suffit de lancer ./test key
Je pense que l'allocation de l'espace mémoire est bonne car elle représente bien ce que je souhaite faire :
(NMAXCLI * taille d'un pointeur sur char) + (NMAXCLI * taille max d'un pseudo)
réctiffiez moi si je me trompe
L'écriture provoque évidement une erreure de ségmentation car je doit mal m'y prendre, j'ai essayé beaucoup de combinaisons mais sans trouver la bonne.
merci pour vos conseils
Cyril
Message édité par misterpatate le 20-05-2007 à 17:28:58
---------------
Le HTML c'est pour les papys, passez à OpenLaszlo : http://www.misterpatate.fr