Newsgroup: it.comp.lang.c
Titolo: Open FIFO che si blocca :-O

Vi mando un pezzo del programma che stoscrivendo. E' un server in memoria 
condivisa.
Tutto viene compilato ma poi, quando lo eseguo, si blocca al comando di 
apertura dell FIFO. Vi riporto il pezzo di programma fino a dove c'e' 
l'apertura della FIFO.
Quando dico si blocca vuol dire che non va avanti... è come se stesse 
aspettando qualcosa!!!!
chi mi da una mano?
/******************************************
SERVER
******************************************/
#include<stdlib.h> //libreria standard e controllo dei processi
#include<stdio.h> //libreria di i/o
#include<fcntl.h> // O_RDONLY
#include<errno.h> //libreria per la gestione degli errori
#include<sys/stat.h> //S_IFIFO
#include<sys/sem.h> //libreria per la gestione dei semafori
#include<sys/shm.h> //libreria per la gestione della memoria condivisa
//#include<sys/ipc.h> //libreria funzioni generali per la comunicazione tra 
processi
//#include<unistd.h> //libreria per la gestione dei process
#include "funzioni_semafori.h"
int main()
{
const int ERRORE=-1;
//PER I MESSAGGI
const char* LEGGI_BACHECA="-RD";
const char* SCRIVI_BACHECA="-WR";
const int MSG_SIZE=160;
const int N=10;
char* msg;
//PER LA MEMORIA CONDIVISA
const long SEGMENTO=10;
char* bacheca;
int level=0;
int shm_ID;
//PER I SEMAFORI
const long SEMAFORO=1;
const long NUMERO_SEMAFORI=1;
int sem_ID;
//PER LA FIFO
char* buffer;
int AL_SERVER;
union semun s={1}; //inizializzazione del semaforo al valore 1
if((shm_ID=shmget(SEGMENTO,MSG_SIZE*N+sizeof(char),IPC_CREAT|0666))==ERRORE)
{
printf("\nSERVER - Errore nella shmget() :%s\n",strerror(errno));
exit(1);
}
printf("\nSERVER - Memoria creata shmget()\n");
if((bacheca=(char*)shmat(shm_ID,0,0))==NULL)
{
printf("\nSERVER - Errore nella shmat() :%s\n",strerror(errno));
exit(1);
}
printf("\nSERVER - Memoria collegata shmat()\n");
*bacheca=0;
++bacheca;
sem_ID=SemCreaInit(SEMAFORO,NUMERO_SEMAFORI,s);
printf("\nSERVER - Semafori creati e inizializzati()\n");
unlink("AL_SERVER");
if((mknod("AL_SERVER", S_IFIFO|0666,0)==ERRORE))
{
printf("\nSERVER - Errore nella mknod() :%s\n",strerror(errno));
exit(1);
}
printf("\nSERVER - Creazione FIFO()\n");
if((AL_SERVER=open("AL_SERVER",O_RDONLY))==ERRORE)
{
printf("\nSERVER - Errore nella open() :%s\n",strerror(errno));
exit(1);
}
printf("\nSERVER - Apertura FIFO()\n");
//RESTO DEL PROGRAMMA

 apertura dell FIFO.
Ciao,
 e' normale che si blocchi! Devi aprirla in modalita' non bloccante ...
man fifo
 Ciao
 Federico

 ha scritto nel messaggio 
news:Pine.LNX.4.58.05...@lxplus073.cern.ch...


 ha scritto nel messaggio 
news:gw0hf.2979$S6.4...@twister2.libero.it...


In merito alla modalità bloccante se poi faccio partire il client con il 
codice che ti roiporto sotto la FIFO si dovrebbe sbloccare, ho sbaglio? Ma 
non lo fa! Si bloccano entrambi i processi
/********************************
BACHECA
********************************/
#include<stdio.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>
#include<sys/sem.h>
int main (int argc, char* argv[])
{
const int ERRORE=-1;
const char* LEGGI_BACHECA="-RD";
const char* SCRIVI_BACHECA="-WR";
char* richiesta;
const int MSG_SIZE=160;
char* msg;
int AL_SERVER;
richiesta=argv[1];
if(!strcmp(LEGGI_BACHECA, richiesta) || !strcmp(SCRIVI_BACHECA,richiesta))
{
if((AL_SERVER=open("AL_SERVER",O_WRONLY))== ERRORE)
{
printf("\nCLIENT - Errore nella open(): %s\n",strerror(errno));
exit(1);
}
if(!strcmp(SCRIVI_BACHECA,richiesta))
{
msg=malloc(MSG_SIZE);
int i= 0;
char c;
printf("\nMessaggio : ");
while ((c=getchar()) != '\n')
msg[i++]=c;
if(write(AL_SERVER,msg,MSG_SIZE) != MSG_SIZE)
{
printf("\nCLIENT - Errore nella write(): %s\n",strerror(errno));
exit(1);
}
}
else
{
if(write(AL_SERVER,"-RD",MSG_SIZE) != MSG_SIZE)
{
printf("\nCLIENT - Errore nella write(): %s\n",strerror(errno));
exit(1);
}
}
close(AL_SERVER);
}
else
{
printf("\nCLIENT -\n%s:\t operazione sconosciuta\n",argv[1]);
exit(1);
}
exit(0);
}

 ha scritto nel messaggio 
news:4U0hf.3038$S6.5...@twister2.libero.it...
