Je cherche à faire une application multi-processus avec de la mémoire partagé (Sous linux) j'ai choisis de faire un tableau de structure (1 structure donc pour chacun de mes éléments pour plus de clarté.
Problème, je n'arrive pas à mettre dans ma mémoire partagé mon tableau de struct pour y accéder ensuite
struct dataStruct {
char ville[20];
int go;
int cpu;
};
struct dataStruct data[5];
Mon tableau est bien remplis avec les bonnes données.
key_t key = ftok("sharedServer",100);
int shmid = shmget(key,sizeof(struct dataStruct) * 5,0666|IPC_CREAT);
if(shmid < 0) {
printf("Serveur : erreur création de mémoire partagé");
exit(1);
}
Cela marche je met bien assez de place dans la mémoire.
data = shmat(shmid, NULL, 0);
Mon problème est là, data est de type tableau et shmat() n'aime pas vraiment, mais je ne sais pas du tout quoi mettre d'autre ici ? J'ai data qui est mon tableau de structure pas d'autre variable ...
Mon problème est là, data est de type tableau et shmat() n'aime pas vraiment, mais je ne sais pas du tout quoi mettre d'autre ici ? J'ai data qui est mon tableau de structure pas d'autre variable ...
shmat() n'est pas là pour aimer. C'est le langage qui dit "onne peut avoir un tableau à gauche du signe égal".
Alors ou bien tu mets la valeurs retournée dans un pointeur
DataStruct* pdata = shmat(shmid, NULL, 0);
et tu t'en sert comme un tableau, pdata[0] c'est la première, ...
Ou bien tu recopies ce qui t'est retourné dans ton tableau data
memcpy( data , shmat(shmid, NULL, 0) , sizeof(data) );
Mon problème est là, data est de type tableau et shmat() n'aime pas vraiment, mais je ne sais pas du tout quoi mettre d'autre ici ? J'ai data qui est mon tableau de structure pas d'autre variable ...
shmat() n'est pas là pour aimer. C'est le langage qui dit "onne peut avoir un tableau à gauche du signe égal".
Alors ou bien tu mets la valeurs retournée dans un pointeur
DataStruct* pdata = shmat(shmid, NULL, 0);
et tu t'en sert comme un tableau, pdata[0] c'est la première, ...
Ou bien tu recopies ce qui t'est retourné dans ton tableau data
memcpy( data , shmat(shmid, NULL, 0) , sizeof(data) );
Merci de la réponse.
J'ai essayer de changer
struct dataStruct* data;
Et dans mon initialisation je fais un malloc de ma structure * 5.
mais
data = shmat(shmid, NULL, 0);
compile mais les données ne sont pas accessibles ailleurs, c'est bizarre parce que normalement cela respecte le principe..
faire un malloc de data, pour ensuite changer la valeur de data! Je pense que tu n'as pas compris ce qu'est l'allocation dynamique.
Qu'entends tu par "les données ne sont pas accessibles ailleurs", c'est quoi "ailleurs" et c'est quoi "pas accessible". La shared memory est accessible de toutes les applications qui en ont demandé l'accès.
Et surtout, le malloc ne sert à rien. L'idée est que dans un premier temps un processus demande à créer un espace mémoire d'une certaine taille avec une étiquette → shmget. Ensuite tout ceux qui veulent y accéder le peuvent grâce à la clé et peuvent s'y attacher grâce à shmat. Le «malloc partagé» est fait en deux temps : allocation (get), puis accès à l'adresse de la mémoire allouée (attach).
L'équivalent du free est lui aussi fait en deux temps : tous ceux qui y accèdent doivent s'en détacher via shmdt. Ensuite un des processus doit faire une demande de libération via un shmctl (ctl comme control). La mémoire partagée sera libérée lorsque tous ceux qui s'y étaient attachés s'en sont détachés.
Tableau de structure et shmat()
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
En recherche d'emploi.
En recherche d'emploi.