Newsgroup: it.comp.lang.c++
Titolo: Problemi implementazione Bacheca

Salve a Tutti
seguendo le informazioni trovate in rete e, per quanto riguarda i semafori,
quelle trovate su questo sito
http://www.lilik.it/~mirko/gapil/gapilsu189.html#x497-24400012.2.5
ho realizzato un server per lo scambio di messaggi in memoria condivisa che
vi riporto per intero a fine messaggio.
In particolare mi da errore sulla riga
const union semun s={1};
e non capisco il perche'
qualcuno puo' aiutarmi?
grazie
/****************
SERVER
****************/
#include<sys/shm.h>
#include<sys/stat.h> // S_IFIFO
#include<fcntl.h> // O_RDONLY
#include <sys/sem.h>
#include<errno.h>
#include<stdio.h>
/**************
FUNZIONI PER I SEMAFORI
****************/
/***************
CREAZIONE E INIZIALIZZAZIONE
****************/
int SemCreaInit(key_t chiave,int num_sem, int val)
{
int sem;
sem = semget(chiave, num_sem, IPC_CREAT|0666);
if (sem == -1)
{
printf("\n Impossibile creare il semaforo \n");
exit(4);
}
semctl(sem, 0, SETVAL, val);
return sem;
};
/*********************************
PRIMITIVA WAIT
**********************************/
int SemWait(int sem)
{
struct sembuf operazione[1]={{0,-1,0}};
return semop(sem, operazione, 1);
};
/*********************************
PRIMITIVA SIGNAL
**********************************/
int SemSignal(int sem)
{
struct sembuf operazione[1]={{0,+1,0}};
return semop(sem, operazione, 1);
};
/******************************
MAIN
*******************************/
int main()
{
//PER MESSAGGI
const char* LEGGI_BACHECA = "-RD";
const int MSG_SIZE=160; //un messaggio è lungo al max 160 caratteri
char* msg; //contiene i msg di 160 caratteri
const int N=10; //numero massimo di messaggi registrabili
const int ERRORE=-1;
//PER MEMORIA CONDIVISA
const long SEGMENTO=10; //nome del segmento di memoria condivisa
char* bacheca; //puntatore alla memoria condivisa
int level=0; //livello di riempimento della momoria cond
int shm_ID; //PID del segmaneto di memoria condivisa
//PER SEMAFORI
const long SEMAFORO=1;
const int MUTEX=0;
const int NUMERO_SEMAFORI=1;
int sem_ID;
const union semun s={1};
//PER FIFO
char* buffer; //contiene i messaggi letti dalla FIFO
int AL_SERVER; //file desciptor della FIFO di ricezione msg
/*******************************
CREA MEMORIA CONDIVISA ADIBITA A BACHECA
********************************/
if((shm_ID=shmget(SEGMENTO,MSG_SIZE*N+sizeof(char),IPC_CREAT|0666))==ERRORE)
{
printf("\nServer - Errore nella shmet: %s\n", strerror(errno));
exit(1);
}
/*******************************
CONNESSIONE ALLA MEMORIA CONDIVISA
*******************************/
if((bacheca=(char*)shmat(shm_ID,0,0))==NULL)
{
printf("\nSERVER - Errore nella shmat() : %s\n",strerror(errno));
exit(1);
}
*bacheca=0; //*bacheca= LIVELLO RIEMPIMENTO BACHECA(level)
++bacheca;
/***********************************
CREA E INIZIALIZZA UN SEMAFORO
***********************************/
sem_ID=SemCreaInit(SEMAFORO,NUMERO_SEMAFORI,s);
/**********************************
rm AL_SERVER
********************************/
unlink("AL_SERVER");
if (mknod("AL_SERVER",S_IFIFO|0666,0) == ERRORE)
{
printf("\nSERVER - Errore nella mknod(): %s\n", strerror(errno));
exit(1);
}
/**********************************
apre la FIFO "AL SERVER" in lettura
**********************************/
if ((AL_SERVER=open("AL_SERVER",O_RDONLY)) == ERRORE)
{
printf("\nSERVER - Errore nella open() : %s\n",strerror(errno));
exit(1);
}
/*********************************
SIMULAZIONE SERVER
**********************************/
int i=3;
while(i--)
{
/********************************
LETTURA DEL MESG DALLA FIFO "AL SERVER"
********************************/
sleep(5);
buffer=(char*)malloc(MSG_SIZE);
if (read(AL_SERVER, buffer, MSG_SIZE) == ERRORE)
{
printf("\nSERVER - Errore nella read() :%s\n",strerror(errno));
exit(1);
}
else
if(fork() == 0)
{
//processo figlio
if(!strcmp(buffer,LEGGI_BACHECA))
{
/*******************************
CARICA BACHECA A SCHERMO
*******************************/
if((level=*(bacheca-1))==0)
{
printf("\nSERVER - La bacheca è vuota\n\n");
exit(0);
}
/*********************************
WAIT(MUTEX)
********************************/
SemWait(sem_ID);
int j=0;
while(j<level)
{
printf("\n#%d msg : %s",j,(bacheca+j*MSG_SIZE));
++j;
}
/****************************
SIGNAL(MUTEX)
*****************************/
SemSignal(sem_ID);
exit(0);
}
else
{
/******************************
INSERIRE IL MESSAGGIO IN BACHECA (memoria condivisa)
******************************/
if((level=*(bacheca-1))==N)
{
printf("\nSERVER - La bacheca è piena\n\n");
exit(0);
}
else
{
/*******************************
WAIT(MUTEX)
*********************************/
WAIT(sem_ID,MUTEX);
strcpy(msg,buffer);
*(bacheca-1)=level+1;
/********************************
SIGNAL(MUTEX)
********************************/
SIGNAL(sem_ID,MUTEX);
exit(0);
}
}
}
}
}


Ciao,
siamo decisamente OT, comunque già che stiamo qui ti aiuto lo stesso e spero
di non fare arrabiare nessuno, anche se la prossima volta ti chiedo di
postare su altri Gruppi come ad esempio it.comp.os.linux.
Veniamo al problema. X/OPEN dice che la "union semun" ce la dobbiamo
definire noi stessi. Includi un file semun.h di tua creazione al programma
dove avrai scritto la definizione della stessa. Copiala dal man semctl,
inizia dal " #if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
" fino alla riga " #endif ".
Così deve funzionare tutto. La prossima volta riporta anche quale è l'errore
esattamente come il tuo compilatore lo scrive, ci aiuti ad aiutarti meglio
(scusa il gioco di parole...)
Buon divertimento,
fabiomdf
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


Ciao,
