Newsgroup: it.comp.os.linux.development
Titolo: IPC Posix e mmap

Salve a tutti.
Il mio progetto sulla comunicazione interprocesso va avanti, ma ogni tanto
incontro qualche intoppo...
Vorrei inserire un semplice esempio che risolve il problema del Produttore /
Consumatore, in cui due processi distinti accedono in mutua esclusione ad
una variabile di scambio, tenuta in memoria condivisa. I due processi si
alternano nell'accesso alla memoria grazie a due semafori.
Il codice in calce è riferito al consumatore; sembra corretto, e infatti
compila senza problemi. Però, in esecuzione, dà l'errore:
mmap: no such device
Qualcuno saprebbe aiutarmi a capire come mai? Eppure il produttore non dà
problemi, ed usa praticamente la stessa mappatura in memoria... Sarà
sicuramente una cretinata, ma non ne vengo a capo. E il termine di consegna
si avvicina pericolosamente!
TIA
Virtual Golem
***** Processo consumatore *****
#include <errno.h>
#include <semaphore.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char *argv[]) {
  int SHMSIZE = 30; /* dimensione del segmento di memoria condivisa */
  sem_t *semp;      /* puntatore al semaforo del produttore */
  sem_t *semc;      /* puntatore al semaforo del consumatore */
  int value;        /* valore del semaforo */
  int fd;           /* file descriptor associato al segmento di memoria
condivisa */
  caddr_t shmptr;   /* indirizzo di inizio della memoria condivisa */
  char shm_fn[] = "my_shm";     /* Posix IPC name del segmento di memoria
condivisa */
  char semp_fn[] = "my_semp";   /* Posix IPC name del semaforo del
produttore */
  char semc_fn[] = "my_semc";   /* Posix IPC name del semaforo del
consumatore */
  int i;            /* contatore di ciclo */
  int numdata;      /* limite di ciclo */
  struct stat stat;
  if(argc != 2) {
    printf("uso: %s <#dati>", argv[0]);
    exit(1);
  }
  /* accesso al segmento di memoria condivisa creato dal produttore */
  if(fd = shm_open(shm_fn, O_RDWR, 0) == -1) {
    perror("shm_open");
    exit(1);
  }
  /*fstat(fd, &stat);*/
  /* collegamento del segmento allo spazio di indirizzamento del processo */
  if((shmptr = mmap(0, SHMSIZE, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0)) ==
(caddr_t) -1) {
    perror("mmap");
    exit(1);
  }
  /* chiusura del file descriptor, non rimuove la mappatura *
  if(close(fd) == -1) {
    perror("close");
    exit(1);
  }*/
  /* accesso ai semafori creati dal produttore */
  if(sem_open(semp_fn, 0) == SEM_FAILED) {
    perror("sem_open");
    exit(1);
  }
  if(sem_open(semc_fn, 0) == SEM_FAILED) {
    perror("sem_open");
    exit(1);
  }
  /* ciclo del consumatore */
  i = 0;
  numdata = atoi(argv[1]);
  while(i < numdata) {
    /* esegue una wait sul semaforo del consumatore per
       richiedere l'accesso in lettura alla memoria condivisa */
    if(sem_wait(semc) == -1) {
      perror("sem_wait");
      exit(1);
    }
    /* legge dal segmento di memoria condivisa */
    printf("\n Consumatore: ho letto il dato numero %d\n", *shmptr);
    i++;
    /* esegue una post sul semaforo del produttore per risvegliarlo */
    if(sem_post(semp) == -1) {
      perror("sem_post");
      exit(1);
    }
  }
  /* chiusura dei semafori del produttore e del consumatore */
  if(sem_close(semp) == -1) {
    perror("sem_close");
    exit(1);
  }
  if(sem_close(semc) == -1) {
    perror("sem_close");
    exit(1);
  }
  /* scollegamento del segmento di memoria condivisa */
  if(munmap(shmptr, SHMSIZE) == -1) {
    perror("munmap");
    exit(1);
  }
  exit(0);
}

 mmap: no such device
potrebbe essere una cavolta, ma hai montato tmpfs su /dev/shm ? mi sembra
sia necessaio per le semantiche posix.....


 if( ( fd = shm_open(shm_fn, O_RDWR, 0) ) == -1) {
 
oppure (più piacevole da leggere):
    fd = shm_open(shm_fn, O_RDWR, 0);
    if( fd == -1 ) { 
Max

 sia necessaio per le semantiche posix.....
io non ho toccato nulla, ma in /etc/fstab c'è la riga di tmpfs.
Tra l'altro, anche il produttore usa mmap, e non dà problemi.
E ancora, nel codice dello Scrittore che ho inviato nel mio post del 29/01
c'è lo stesso meccanismo, e gira meglio di una trottola...
Forse il problema potrebbe essere la dimensione della memoria condivisa?
Magari 30 è poco? Non so più che pesci pigliare... Comincio a credere che il
mio PC sia posseduto!
Virtual Golem

 si avvicina pericolosamente!
...
1) Di solito uso shmat.
2) Se vuoi ti mando il codice di mpg321 con delle patch recenti, che usa
produttore e consumatore, con semafori e buffer circolare condiviso su
shm.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
    -<! And the will shall return And again hearts shall burn
         All the horns now will sing Leading you back to the metal winds !>-
                  Lost Horizon - Sworn In The Metal Wind