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

Salve a tutti.
Studio informatica all'università e devo consegnare al professore una
relazione sulle differenze tra le comunicazioni interprocesso di System V e
di Posix. Tra gli esempi a corredo di questa relazione pensavo di inserire
quello che riporto in calce, dove uso le funzioni Posix per la gestione dei
semafori e della memoria condivisa.
Come potete vedere, si tratta di un processo scrittore, che scrive interi in
un'area di memoria condivisa. Ci sarà poi un processo lettore (di cui non
riporto il codice) che leggerà dalla stessa area. L'accesso alla memoria
condivisa è regolato da un semaforo.
Credo che il codice sia corretto.
E ora veniamo finalmente al dunque. Se provo a compilare con il comando:
gcc -o scrittore scrittore.c
ottengo il seguente responso:
/tmp/ccIWB4fj.o(.text+0x28): In function `main':
: undefined reference to `shm_open'
/tmp/ccIWB4fj.o(.text+0xc7): In function `main':
: undefined reference to `sem_open'
/tmp/ccIWB4fj.o(.text+0x131): In function `main':
: undefined reference to `sem_post'
/tmp/ccIWB4fj.o(.text+0x15e): In function `main':
: undefined reference to `sem_close'
/tmp/ccIWB4fj.o(.text+0x16e): In function `main':
: undefined reference to `shm_unlink'
collect2: ld returned 1 exit status
Non ho molta esperienza, ma credo che sia un errore del linker. È come se
non trovasse nessuna delle funzioni di IPC Posix che uso. Le funzioni di
System V, invece non danno problemi.
Dove ho sbagliato? Spero vivamente che possiate aiutarmi... devo consegnare
la relazione il 5 febbraio!
Grazie in anticipo.
/********** scrittore.c ***********/
#include <unistd.h>
#include <semaphore.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
char shm_fn[] = "my_shm";
char sem_fn[] = "my_sem";
main() {
  caddr_t shmptr;
  unsigned int mode;
  int shmdes, index;
  sem_t *semdes;
  int SHM_SIZE;
  mode = S_IRWXU|S_IRWXG;
  /* Apertura dell'oggetto di memoria condivisa */
  if ( (shmdes = shm_open(shm_fn,O_CREAT|O_RDWR|O_TRUNC, mode)) == -1 ) {
    perror("shm_open");
    exit();
  }
  /* Allocazione di un'area di memoria condivisa */
  SHM_SIZE = 1000;
  if(ftruncate(shmdes, SHM_SIZE) == -1) {
    perror("ftruncate");
    exit();
  }
  if((shmptr = mmap(0, SHM_SIZE, PROT_WRITE|PROT_READ, MAP_SHARED,
shmdes,0)) == (caddr_t) -1) {
    perror("mmap");
    exit();
  }
  /* Creazione di un semaforo in stato locked */
  semdes = sem_open(sem_fn, O_CREAT, 0644, 0);
  if(semdes == (void*)-1) {
    perror("sem_open");
    exit();
  }
  /* Accesso all'area di memoria condivisa */
  for(index = 0; index < 100; index++) {
    printf("Scrivo %d nella memoria condivisa shmptr[%d]\n", index*2,
index);
    shmptr[index]=index*2;
  }
  /* Rilascio del lock sul semaforo */
  sem_post(semdes);
  munmap(shmptr, SHM_SIZE);
  /* Chiusura dell'oggetto di memoria condivisa */
  close(shmdes);
  /* Chiusura del semaforo */
  sem_close(semdes);
  /* Cancellazione dell'oggetto di memoria condivisa */
  shm_unlink(shm_fn);
}

  if(semdes == (void*)-1) {
Questo deve essere
  if( semdes == SEM_FAILED ) {
(Nota che per i "named semaphores" ci vuole la NPTL.)
Max

 (Nota che per i "named semaphores" ci vuole la NPTL.)
Intendi la Native Posix Thread Library, vero? Forse è questo il motivo
dell'errore... Attualmente, per comodità sto lavorando sul mio portatile con
la release Knoppix 3.2. Se provassi con la RedHat 9 funzionerebbe? Mi pare
di ricordare che la supporti...
TIA
Virtual Golem

 pare di ricordare che la supporti...
Non sono aggiornato su questo.
Max

Ho avuto modo di provare usando la RedHat 9 e pare che funzioni.
Ho fato qualche ricerca, e sembra che RedHat sia un po' lo sponsor della
NPTL...
Grazie per l'aiuto, mi sei stato davvero molto utile.
Virtual Golem