![]() |
Bonjour et bienvenu par les États-Unis à la UNIX et Linux Forums! Merci de votre visite et vous joindre à notre communauté mondiale.
|
|
google unix.com
|
|||||||
| Forums | S'inscrire | Forum Rules | Liens | Albums | FAQ | Liste des membres | Calendrier | Recherche | Aujourd'hui, les postes | Marquer les forums comme lus |
| High Level Programming Posez vos questions à propos de C, C + +, Java, SQL, et d'autres langages de programmation ici. |
Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
|
||||
| Fil | Thread Starter | Forum | Réponses | Last Post |
| [C] Problèmes avec la mémoire partagée | hurricane86 | High Level Programming | 2 | 11-26-2008 05:58 PM |
| Mémoire partagée de la bibliothèque partagée | otheus | High Level Programming | 0 | 09-03-2008 03:55 AM |
| Mémoire partagée dans la bibliothèque partagée | DreamWarrior | High Level Programming | 12 | 05-30-2007 04:33 PM |
| partage de la mémoire - pas de mémoire partagée -- | elzalem | High Level Programming | 9 | 05-02-2007 07:45 AM |
| Manque de mémoire partagée, mais beaucoup de mémoire inutilisée | cjcamaro | UNIX for Advanced & Expert Users | 1 | 10-13-2004 05:10 PM |
![]() |
|
|
LinkBack | Thread Tools | Recherche sur ce Thread | Rate Thread | Modes d'affichage |
|
|
|
||||
|
Problèmes avec la mémoire partagée et les listes
Salut, j'ai besoin de mettre en mémoire une liste avec l'objet de cette structure:
Code:
typedef struct Obj{
char objname[20];
struct Obj *nextObj;
}Object
J'ai lu dans un autre thread (ici -> dynamique de la mémoire partagée ) qui donne malloc sone des problèmes avec la mémoire partagée Citation:
j'ai essayé de partager l'objet de cette façon: Code:
Obj *head; //pointer to the head of my FILLED list int shmid; Obj *sh; ... shmid = shmget(SHMKEY,(sizeof(Obj)*10),0666|IPC_CREAT|IPC_EXCL); ... sh = (Obj *)shmat(shmid, 0, 0666); ... *sh = *head; Merci pour votre soutien, ce qui est meilleur. |
|
||||
|
Voici le problème: les pointeurs que malloc () retourne locales à l'espace d'adressage du processus qui a appelé malloc (). Ces valeurs ne veut rien dire dans le cadre d'un autre processus. Ainsi, mettre ces chiffres en mémoire partagée et les utiliser à partir d'un autre processus d'invoquer le comportement indéfini. Si vous êtes chanceux, votre programme va alors se bloquer. Si vous n'êtes pas chanceux, vous pourriez provoquer une supernova quelque part (un peu d'humour C).
Alors, que vous avez à faire est d'allouer une partie de la mémoire partagée, et de rédiger un "malloc" et "libre" qui utilisent ce pool de mémoire. En d'autres termes, vous devez écrire un petit allocateur de mémoire / deallocator qui utilise la mémoire partagée de cette piscine, et ensuite retour de compensations. Étant donné que tous vos objets sont les mêmes, ce sera assez trivial. Avis J'ai dit «compensations» et non «adresses». Je ne me souviens pas n'importe où dans tout ce que je n'ai jamais lu que la garantie que la mémoire partagée sera affecté de la même adresse dans différents processus. En supposant que oui, et l'utilisation de ces valeurs dans vos listes seront probablement revenir à l'original de votre problème. Ainsi, vous aurez à traiter ce problème de manière intelligente. Vous pouvez écrire ce soit en général (se chargera de l'attribution de toute taille) ou spécifiques (traite uniquement les objets de votre type struct Obj). Quoi qu'il en soit est bien, mais je pense que l'exercice de la rédaction de la volonté générale vous apprendre de plus. C'est une tâche assez facile, mais il ya des choses à surveiller. Je vais vous donner deux: a) un seul processus peut initialiser le pool de mémoire partagée. Démarrer le processus PREMIER, initialisez la piscine, puis commencer les autres. Sinon, vous allez avoir de multiples processus saccage votre piscine. b) Que se passe t'il si un processus qui est quelque chose de l'attribution de cette piscine est interrompu au milieu d'une allocation, et un autre processus tente également d'allouer quelque chose de cette piscine partagée. Attention: si vous le faites mal, les mauvaises choses qui se passera, et votre mère se moquent de vous. Notez que l'accès à la liste peut également conduire au même genre de problèmes, parce que dans le cas général, vous ne savent pas nécessairement si un autre processus de la coopération a manipulé la liste. Une autre chose: dans votre message, vous avez eu: Code:
*sh = *head; HTH |
|
||||
|
merci pour votre réponse
J'ai résolu mon problème d'une autre manière .. mais je vais essayer votre solution trop pratique rend parfait!mais il ya une autre question / réponses, je voudrais savoir: 1) J'ai ri à haute voix sur votre humour, sérieux xD Je suis l'un de ceux qui s'enfuit si quelqu'un diviser par zéro sur une calculatrice (je n'aime pas les trous noirs); 2) J'ai résolu mon problème de cette façon: (7 est le numéro de l'objet de ma liste) Code:
Obj *pp, *head;
...
..
if((shmid = shmget(SHMKEY, 7, 0777|IPC_CREAT|IPC_EXCL)) == -1){
perror("shmget");
exit(1);
}
if((sh = (Obj *)shmat(shmid, 0, 0777)) ==(Obj *) -1){
perror("shmat");
exit(1);
}
int a;
pp = head;
for(a=0; a<7; a++){
*(sh+a) = *pp;
pp = pp->next;
}
...
Code:
Obj *p, *List;
...
p=List;
for(a=0; a<7; a++){
*p=*(sh+a);
p=p->next;
}
...
3) Je suis un peu incohérent avec la mémoire partagée. Je veux dire, ce que je pense à la façon dont cela fonctionne est - (j'espère que vous comprendrez mon anglais pour les nuls de langue de niveau) - comme une "boîte" où je peux mettre des choses. Mais si je tente de mettre dans un pointeur, je vais prendre maaany problèmes. Ainsi, la liste que j'ai en putted (avec ma méthode), ne sont plus se comporter comme une liste, mais plus probablement à """"" chaîne """"" (voir pour "" ).exemple: Code:
if((shmid = shmget(SHMKEY, 7, 0777|IPC_CREAT|IPC_EXCL)) == -1){
perror("shmget");
exit(1);
(... .. shmat) X devient une véritable valeur, dans mon cas, Obj. puis j'ai 7 slots de la taille de chaque Obj. quand je remplir ma boîte, je remplir individuellement créneaux se déplaçant à travers la mémoire partagée avec sh + +, et non pas de pointeur vers le prochain obj. À mon avis, hein? ou complètement faux! ![]() merci encore ![]() |
|
||||
|
Il s'agit d'un problème:
Code:
Obj *pp, *head; ... pp = head; /* other stuff involving pp, which is wrong because pp was set to an unknown value. */ Je pense que ce que vous devez faire est de dessiner une image (une boîte, peut-être) et la diviser en morceaux (autant que vous avez des objets) et ensuite tirer les flèches qui représentent les pointeurs. Votre code ci-dessous ne fonctionne pas parce que c'est correct, il fonctionne parce que vous êtes malchanceux. |
![]() |
| Bookmarks |
| Thread Tools | Recherche sur ce Thread |
| Modes d'affichage | Rate this thread |
|
|