![]() |
Ciao e benvenuto da parte degli Stati Uniti al UNIX e Linux Forum! Grazie per la visita ed unirsi alla nostra Comunità Globale.
|
|
google unix.com
|
|||||||
| Forum | Registrati | Regole Forum | Collegamenti | Album | FAQ | Members List | Calendario | Ricerca | Today's Posts | Mark Forums Read |
| 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 |
![]() |
|
|
LinkBack | Thread Tools | Cerca in questo Thread | Rate Thread | Modalità di visualizzazione |
|
|
|
||||
|
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 letto in un altro thread (qui -> dinamica della memoria condivisa ), che dà malloc sone con problemi di memoria condivisa Citazione:
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; Grazie per il vostro sostegno, best regards. |
|
||||
|
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; HTH |
|
||||
|
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;
}
...
Codice:
Obj *p, *List;
...
p=List;
for(a=0; a<7; a++){
*p=*(sh+a);
p=p->next;
}
...
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);
(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 ![]() |
|
||||
|
Questo è un problema:
Codice:
Obj *pp, *head; ... pp = head; /* other stuff involving pp, which is wrong because pp was set to an unknown value. */ 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. |
![]() |
| Segnalibri |
| Thread Tools | Cerca in questo Thread |
| Modalità di visualizzazione | Vota questo thread |
|
|