Newsgroup: it.comp.os.linux.development
Titolo: Shared memory

salve a tutti,
mi sono scontrato contro questo muro:
creo una nuova istanza di un mio oggetto:
oggetto *nuovo,*condiviso;
nuovo = new oggetto();
ora ho la necessità di modificare questo
oggetto da un'altro processo, per fare ciò ho creato
un puntatore al mio oggetto in mem condivisa:
....shmget(... ;
condiviso = (oggetto *)shmat(...
ora come faccio a utilizzare condiviso per modificare nuovo?
gazie...
-- 
L'unica cosa certa è che non esiste nulla di certo...


Key fingerprint = CE3C 7E01 6782 30A3 5B87  87C0 BB86 505C 6B2A CFF9

 
mi va in segfault... ti scrivo il listato così ci capiamo meglio:
frmMain *seriale, *shmemFrm;
if ((shmidFrm=shmget(IPC_PRIVATE,sizeof(frmMain),00600|SHM_R|SHM_W)) == -1){
    fprintf(stderr,"Couldn't get new page\n");
    return -1;
  }
  if ((shmemFrm=(frmMain *)shmat(shmid,NULL,0)) == (frmMain *)-1){
    fprintf(stderr,"Couldn't attach new page\n");
    return -1;
  } 
  seriale = new(shmemFrm) frmMain();
 switch(pid_t pr = fork()){
      case 0:{         //figlio
        ????->caption("Funziona!!!");
        ......
        break;
      }
      default:{         //padre
        ?????->show();  
        ......
        }                   //visualizzo il form
   }
in particolare al posto dei punti di domanda
cosa devo usare?
shmemFrm o seriale?!
e la chiamata a shmat la devo lasciare?
grazie mille!!!


 frmMain *seriale, *shmemFrm;
L'unico tipo di strutture che abbia un senso costruire e manipolare in 
memoria condivisa sono le strutture POD (le struct del C, in sostanza) 
*prive* di puntatori. *Qualunque* altro tipo di oggetto, anche se costruito 
in memoria condivisa, non potrŕ ragionevolmente essere utilizzato da 
processi diversi da quello che l'ha instanziato.
Max

 ora come faccio a utilizzare condiviso per modificare nuovo?
Mi sembra un modo proprio strano, comunque...
Dopo aver attaccato la shmem in entrambi i processi devi in uno fare in modo
che il costruttore crei l'oggetto nella shm, e nell'altro va bene la
semplice assegnazione condiviso = (obj *) ind_shm.
Per me ti incasini la vita.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! I Never Wanted To Be What They Told Me To Be
  		Fulfill My Fate Then I'll Be Free >!- Blind Guardian - Mordred's Song

 ora come faccio a utilizzare condiviso per modificare nuovo?
La memoria condivisa va vista in termini statici, non dinamici.
La memoria va prima allocata e poi gestita esplicitamente. Mai fare
affidamento al compilatore. Bisogna fare dei lock per evitare accessi
contemporanei, dei flag/semafori per sincronizzare i vari processi,
evitare i puntatori (processi diversi possono vedere lo stesso oggetto
ad indirizzi diversi ed un indirizzo potrebbe essere valido in un
processo ed invalido in un altro) ed usare offsets, sincronizzare accessi
non atomici (tipo gestione di liste e consimili), configurare il compilatore
per evitare il prefetch degli oggetti (via "volatile" oppure usando lo
switch "-fvolatile" di compilazione).
E` un modo di lavorare diverso dal solito, bisogna abituarsi.
Ciao,
-- 
       Roberto Divia`             Love at first sight is one of the greatest
       =============             labour-saving devices the world has ever seen.
Mailbox: C02110                 CERN-European Organization for Nuclear Research
E-mail: 
Robert...@cern.ch
           CH-1211 GENEVE 23, Switzerland

Denis wrote:

Io ho messo 'seriale' e mi ha funzionato.... ( compila e l'"oggetto" è in
memoria condivisa ! ).
Vale quanto ti ha detto Max.M. se sono strutture la cosa funziona, ma se
sono oggetti complessi.... i risultati potrebbero essere non quelli
aspettati...
