The UNIX and Linux Forums  
Ciao e benvenuto da parte degli Stati Uniti al UNIX e Linux Forum! Grazie per la visita ed unirsi alla nostra Comunità Globale.

Go Back   UNIX e Linux Forum > Inizio Forum > Di programmazione ad alto livello
.
google unix.com



Di programmazione ad alto livello Pubblica domande su C, C + +, Java, SQL, e di altri linguaggi di programmazione qui.

Più di UNIX e Linux Forum Argomenti potreste trovare utili
Filo Thread Starter Forum Risposte Ultimo Post
[C] Problemi con la memoria condivisa hurricane86 Di programmazione ad alto livello 2 11-26-2008 05:58 PM
Memoria condivisa per la libreria condivisa otheus Di programmazione ad alto livello 0 09-03-2008 04:55 AM
Memoria condivisa in libreria condivisa DreamWarrior Di programmazione ad alto livello 12 05-30-2007 05:33 PM
la condivisione della memoria - la memoria condivisa non -- elzalem Di programmazione ad alto livello 9 05-02-2007 08:45 AM
Carenza di memoria condivisa, ma un sacco di memoria non utilizzati cjcamaro UNIX e avanzata per utenti esperti 1 10-13-2004 06: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 Cerca in questo Thread Rate Thread Modalità di visualizzazione
  #1 (permalink)  
Old 06-28-2009
BeNdErR BeNdErR is offline
Utente Registrato
  
 

Iscriviti Data: giugno 2009
Interventi: 4
Problemi con la memoria condivisa ed elenchi

Ciao, ho bisogno di mettere in un elenco di memoria condivisa con il fatto oggetto di questa struttura:

Codice:
typedef struct Obj{
char objname[20];
struct Obj *nextObj;
}Object
Ho riempito con la mia lista (per esempio) 10 elementi, ma quando cerco di metterlo in memoria condivisa per essere letto da un altro processo di ottenere i segmentation fault dopo la prima leggere il record ..
Ho letto in un altro thread (qui -> dinamica della memoria condivisa ), che dà malloc sone con problemi di memoria condivisa
Citazione:
Se si chiama malloc per creare linked_list_header-> ptr, quindi l'indirizzo restituito dalla malloc è privato al chiamante (il processo che chiama malloc) processo. Stessa con NODO-> buffer. Si dovrà assegnare queste cose in comune "a mano" senza rimettere malloc.
ma non capisco quello che ho da fare ora e come risolvere il mio problema.

Ho provato a parti oggetto in questo modo:
Codice:
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;
Probabilmente mi manca qualcosa o forse ho sbagliato tutto ... come faccio ad assegnare Ob in comune "a mano" senza rimettere malloc?

Grazie per il vostro sostegno, best regards.
  #2 (permalink)  
Old 06-29-2009
mgessner mgessner is offline
Utente Registrato
  
 

Iscriviti Data: ottobre 2007
Posti: 50
Ecco il problema: le indicazioni che malloc () restituisce locali di spazio l'indirizzo del processo che chiama malloc (). Tali valori non significa nulla, nel contesto di un altro processo. Pertanto la messa in comune i numeri della memoria e il loro uso da un altro processo di invocare il comportamento non definito. Se sei fortunato, il tuo programma sarà poi crash. Se non si è fortunati, si potrebbe causare una supernova da qualche parte (un po 'di umorismo C).

Quindi ciò che devi fare è quello di assegnare una porzione di memoria condivisa, e di scrivere una "malloc" e "libero" che l'uso che pool di memoria. In altre parole, è necessario scrivere una piccola allocatore di memoria / deallocator che utilizza questo pool di memoria condivisa, e poi passa di nuovo da compensazioni. Dal momento che tutti i tuoi oggetti sono la stessa cosa, questa sarà piuttosto banale.

Avviso ho detto "compensazioni" e non "indirizzi". Non ricordo nulla in qualsiasi parte che abbia mai letto che garantisce che la memoria condivisa verrà assegnato lo stesso indirizzo in diversi processi. Supponendo ciò, e l'utilizzo di tali valori nelle vostre liste probabilmente vi porterà al vostro problema. Quindi si troveranno a dover gestire il problema in modo intelligente.

È possibile scrivere ad essere di carattere generale (in grado di gestire qualsiasi formato di assegnazione) o specifiche (solo gestisce le cose del vostro tipo struct Ob). Ad ogni modo va bene, ma credo che l'esercizio delle competenze di scrittura in generale vi insegnerà più.

Si tratta di un compito abbastanza facile, ma ci sono alcune cose a cui fare attenzione. Vi darò due:

a) Solo un processo può inizializzare il pool di memoria condivisa. Inizia il processo PRIMA, inizializzare la piscina, e quindi avviare le altre. In caso contrario, vi sono più processi potenzialmente cestinare la vostra piscina.

b) Che cosa succede se un processo che è qualcosa di assegnazione di questo piscina viene interrotta durante la metà di una dotazione, e anche un altro processo tenta di allocare qualcosa da questa piscina. Attenzione: se si esegue questa operazione sbagliata, cose cattive che accadrà, e tua madre si ridere voi. Si noti che l'accesso alla lista può portare anche allo stesso tipo di problemi, perché nel caso generale non è necessariamente sapere se un altro ha collaborato processo manipolato lista.

Un altra cosa: nel tuo post, si era:

Codice:
*sh = *head;
Questo è sbagliato: a) non si desidera modificare il contenuto di sh, e b) che si desidera testa al punto di sh, non il contrario.

HTH
  #3 (permalink)  
Old 06-29-2009
BeNdErR BeNdErR is offline
Utente Registrato
  
 

Iscriviti Data: giugno 2009
Interventi: 4
Thumbs up

grazie per la risposta Ho risolto il mio problema in un altro modo .. ma Cercherò la soluzione troppo pratica rende perfetti!

ma vi sono alcune altre domande / risposte Vorrei sapere:

1) mi si mise a ridere ad alta voce il vostro umore, sul serio xD I'm uno di coloro che fugge se qualcuno dividere per zero su un calcolatore (Odio i buchi neri);

2) ho risolto il mio problema in questo modo: (7 è il numero in oggetto della mia lista)
Codice:
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;
		}
...
sembra funzionare bene. D'altra "faccia" di leggere i dati in questo modo:
Codice:
Obj *p, *List;
...
p=List;
for(a=0; a<7; a++){
		*p=*(sh+a);
		p=p->next;
	}
...
cosa pensate di questo?

3) ho messo un po 'con la memoria condivisa. Voglio dire, quello che penso su come funziona è - (ci auguriamo che il mio inglese-per-manichini-lingua-livello) - come una "scatola", dove posso mettere le cose. Ma se provo a mettere dentro un puntatore I'll get maaany problemi. Quindi l'elenco ho messe in (con il mio metodo) non sono più comportarsi come una lista, ma più probabilmente come un """"" stringa """"" (per vedere "" ).
esempio:
Codice:
if((shmid = shmget(SHMKEY, 7, 0777|IPC_CREAT|IPC_EXCL)) == -1){
			perror("shmget");
			exit(1);
ora ho una scatola di 7 slot di x-dimensione. una volta che io attribuisco la memoria
(shmat ... ..) di X diventa un vero e proprio valore, nel mio caso Ob. poi ho 7 slot di Ob-ogni dimensione.
quando ho la mia casella di riempire, compilare i singoli slot in movimento attraverso la memoria condivisa con sh + +, e non con il puntatore al prossimo obj.

è il mio parere giusto? o completamente errate?!


grazie di nuovo
  #4 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Utente Registrato
  
 

Iscriviti Data: ottobre 2007
Posti: 50
Questo è un problema:
Codice:
Obj *pp, *head;
...
pp = head;

/* other stuff involving pp, which is wrong because pp was set to an unknown value. */
testa non è mai stato inizializzato. È sempre necessario inizializzare un puntatore prima di usarla. Essa deve essere NULL (nel qual caso non dereferenzia) oppure si deve puntare a qualcosa.

Penso che ciò che devi fare è tracciare un quadro (una scatola, forse) e lo si divide in pezzi (come molti di voi hanno oggetti) e poi trarre le frecce che rappresentano i puntatori.

Il codice di seguito non funziona perché è corretto, ma funziona perché si è sfortunato.
  #5 (permalink)  
Old 06-30-2009
BeNdErR BeNdErR is offline
Utente Registrato
  
 

Iscriviti Data: giugno 2009
Interventi: 4
aspettare, ho dimenticato di dire che * capo è il capo di tutta la mia lista .. Così ho inizializzare almeno ogni puntatore a NULL valore?
  #6 (permalink)  
Old 06-30-2009
mgessner mgessner is offline
Utente Registrato
  
 

Iscriviti Data: ottobre 2007
Posti: 50
È possibile impostare pp \u003d testa, ma non hai mai impostato nulla in testa al tuo esempio.
  #7 (permalink)  
Old 06-30-2009
BeNdErR BeNdErR is offline
Utente Registrato
  
 

Iscriviti Data: giugno 2009
Interventi: 4
Sì, non a causa della lunghezza della parte in cui ho impostato il valore di testa thougth è meglio dire che è stato capo il puntatore alla testa di tutta la mia lista, invece di inviare il codice del tutto ..
Reply

Segnalibri

Thread Tools Cerca in questo Thread
Cerca in questo Thread:

Ricerca Avanzata
Modalità di visualizzazione Vota questo thread
Vota questo thread:

Distacco regolamento
Tu non può post nuovo thread
Tu non può inviare una risposta
Tu non può postare allegati
Tu non può modificare i tuoi post

BB codice è Su
Smilies sono Su
[IMG] codice Su
Codice HTML è Chiuso
Trackbacks sono Su
Pingbacks sono Su
Refbacks sono Su




Tutti gli orari sono GMT -4. La data di oggi è 08:33 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traduzioni Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX e Linux Forum Content Copyright © 1993-2009. Tutti i diritti Reserved.Ad di gestione da RedTyger

Contenuti pertinenti URL da vBSEO 3.2.0