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

su linux programming unleashed ho trovato questo esempio (ho tolto gli
headers e tutto quanto non c'entrava con il mio dubbio per accorciare) :
int main(int argc, char *argv[])
{
   int shmid;
   char *shmbuf;
   int i;
 
   shmid = atoi(argv[1]);
   if ((shmbuf = shmat (shmid, 0, 0)) < (char *) 0) {
      perror ("shmat");
      exit (EXIT_FAILURE);
   }
   if ((shmbuf = malloc (sizeof (char) * BUFSZ)) == NULL) {
      perror ("malloc");
      exit (EXIT_FAILURE);
   }
   for (i = 0; i < BUFSZ; ++i)
      shmbuf[i] = rand();
// [poca altra roba ma niente di rilevante]
exit (EXIT_SUCCESS);
}
il programma in oggetto dovrebbe scrivere su un segmento di shared
memory...ma è proprio così ?
voglio dire...con shmat shmbuf punta effettivamente alla memoria
condivisa ma quel malloc non lo fa puntare ad una regione di memoria
sull'heap privata ?
scusate se ho scritto una cazzata tremenda:)
grazie
Franz

Un'altra cosa sulla shared memory ... esiste un qualche motivo per cui
il processo che crea la shared memory debba farlo specificando una key
(col rischio che sia già in uso) invece che IPC_PRIVATE?
E poi perchè in tutti i testi che sto leggendo sull'argomento c'è
scritto che i processi che vogliono attaccarsi hanno bisogno della key
quando è piu' semplice passarsi l'id che non la key (per attaccarsi
avendo la key bisogna comunque chiamare shmget con la key per avere
l'id, da dare poi come parametro a shmat) ?
Specificando la key e quindi conoscendola già a priori si possono
scrivere processi che non hanno bisogno di cercare l'id (in qualche modo
comunicata dal processo che ha creato la memoria), ma resta il problema
che la key stessa potrebbe essere già in uso..
grazie di nuovo
Franz

 memory...ma č proprio cosě ?
...
Nein. Prima usi shmget per prenderti un segmento condiviso, poi con shmat lo
mappi nello spazio di indirizzamento del tuo processo.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://yoda.ing.unibs.it/~cowo
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! Adding features does not necessarily increase functionality -- it just
		makes the manuals thicker. !>-

 l'id, da dare poi come parametro a shmat) ?
...
Tu hai disponibili un certo numero di key che si riferiscono a segmenti
mappati in memoria, dove capita. Immagina l'ID come l'effettivo puntatore al
segmento. Non e' cosi' ma rispecchia il fatto della diversa realizzazione
del segmento di volta in volta.
Che differenza ti farebbe passare la key piuttosto che l'ID? Risparmieresti
una syscall. Guadagno?


 l'implementazione di Linux faccia cilecca e' un altro paio di maniche.
Grazie per i chiarimenti.
Mi puoi pero' dire come posso evitare al 100% che la key che voglio usare
per allocare un nuovo segmento di shared memory non sia già usata ?
Da quello che ho capito non è possibile e questo mi sembra una mancanza
inspiegabile da parte della IPC...no?
Franz

 inspiegabile da parte della IPC...no?
Bah. Fai un ciclo e insisti. In generale la mia opinione e' che se ho
bisogno della condivisione di memoria per ottimizzare al massimo le
prestazioni uso un'architettura multithread, non multiprocesso.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://yoda.ing.unibs.it/~cowo
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! Computer programmers never die, they just get lost in the processing. !>-