The UNIX and Linux Forums  
Bonjour et bienvenu par les États-Unis à la UNIX et Linux Forums! Merci de votre visite et vous joindre à notre communauté mondiale.

Go Back   Les systèmes UNIX et Linux Forums > Top Forums > High Level Programming
.
google unix.com



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

Reply
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Recherche sur ce Thread Rate Thread Modes d'affichage
  #1 (permalink)  
Old 06-28-2009
BeNdErR BeNdErR is offline
Registered User
  
 

Date d'inscription: juin 2009
Messages: 4
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 rempli ma liste (par exemple) 10 éléments, mais lorsque je tente de le mettre en mémoire partagée d'être lu par un autre processus de segmentation fault i get après la première lecture record ..
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:
Si vous avez appelé malloc pour créer linked_list_header-> ptr, puis l'adresse renvoyée par malloc est privé à l'appel (le processus qui appelle malloc) processus. Même avec NOEUD-> buffer. Vous devrez allouer ces choses en commun "à la main" sans appel malloc.
mais je ne comprends pas ce que j'ai à faire maintenant et comment résoudre mon problème.

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;
J'ai probablement manqué quelque chose ou peut-être que je suis tout à fait tort ... comment puis-je renvoyer Obj partagée "à la main" sans appel malloc?

Merci pour votre soutien, ce qui est meilleur.
  #2 (permalink)  
Old 06-29-2009
mgessner mgessner is offline
Registered User
  
 

Join Date: Oct 2007
Posts: 50
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;
Ceci est faux: a) vous ne voulez pas changer le contenu de sh, et b) que vous voulez la tête au point de sh, et non l'inverse.

HTH
  #3 (permalink)  
Old 06-29-2009
BeNdErR BeNdErR is offline
Registered User
  
 

Date d'inscription: juin 2009
Messages: 4
Thumbs up

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;
		}
...
elle semble fonctionner correctement. De l'autre côté "i lire les données de cette façon:
Code:
Obj *p, *List;
...
p=List;
for(a=0; a<7; a++){
		*p=*(sh+a);
		p=p->next;
	}
...
que pensez-vous que?

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);
maintenant j'ai une boîte de 7 slots d'x-dimension. Je joins une fois de mémoire
(... .. 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
  #4 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Registered User
  
 

Join Date: Oct 2007
Posts: 50
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. */
la tête n'a jamais été initialisé. Vous devez toujours initialiser un pointeur avant de l'utiliser. Il doit être soit NULL (dans ce cas, vous n'avez pas déréférence) ou vous devez point il à quelque chose.

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.
  #5 (permalink)  
Old 06-30-2009
BeNdErR BeNdErR is offline
Registered User
  
 

Date d'inscription: juin 2009
Messages: 4
attendez, j'ai oublié de dire que la tête * est à la tête de ma liste .. J'ai donc pour initialiser chaque pointeur au moins à la valeur NULL?
  #6 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Registered User
  
 

Join Date: Oct 2007
Posts: 50
Vous définissez pp \u003d tête, mais vous n'avez jamais mis la tête à quoi que ce soit dans votre exemple.
  #7 (permalink)  
Old 06-30-2009
BeNdErR BeNdErR is offline
Registered User
  
 

Date d'inscription: juin 2009
Messages: 4
oui, je n'ai pas raison de la longueur de la partie où j'ai mis la valeur de la tête thougth était mieux de dire que le pointeur de tête était à la tête de ma liste au lieu d'afficher le code entièrement ..
Reply

Bookmarks

Thread Tools Recherche sur ce Thread
Recherche sur ce Thread:

Recherche avancée
Modes d'affichage Rate this thread
Rate this thread:

Règles de messages
Tu mai pas de nouvelles discussions: nonoui
Tu mai pas envoyer des réponses:
Tu mai pas envoyer des pièces jointes
Tu mai pas modifier vos messages

BB code est Sur
Smilies sont Sur
[IMG] code est Sur
Le code HTML est Hors tension
Trackbacks sont Sur
Pingbacks sont Sur
Refbacks sont Sur




Toutes les heures sont au format GMT -4. Le temps est maintenant 05:24 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traductions Langue Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Les systèmes UNIX et Linux Forums Content Copyright © 1993-2009. Tous droits Reserved.Ad de gestion par RedTyger

Content Relevant URLs par vBSEO 3.2.0