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);
}
}
}
}
}

 [CUT]
In questo newsgroup si parla di C standard, prova a chiedere, ad es., su 
it.comp.os.linux.development
PS: credo che troverai ben poche persone disposte a leggere tutto il 
codice che hai postato :)
-- 
Mat/tia Belletti - Graduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Jabber: RedGlow  - Linux registered user 299762 @ machine 213003