PDA

Visualizza la versione completa : [C] Ricezione richieste da una pipe


Ed_Bunker
11-07-2004, 19:55
Ciao, dovendo realizzare un semplice server che accetti richieste da una pipe ho semplicemente utilizzato una pipe con nome creata dal server stesso, aperta in lettura con l'opzione O_NONBLOCK e poi ho fatto un ciclo del genere:




...
...
while (TRUE)
{
if(read(fd, buffer, MAXBUFFER) > )
{
...
...
...
...
...
}
/*Altrimenti torno all'inizio del ciclo infinito*/
}


E' giusto fare cosi' oppure c'e' un modo per evitare di fare continuamente delle read che restituiscono 0 finche' un qualche client scrive sulla pipe con nome ?! Ad esempio non c'e' la possibilita' di ricevere un segnale quando avviene una scrittura sulla pipe oppure un altro modo cosicche' si possa evitare di sprecare "risorse" ?

thks

Ikitt
11-07-2004, 20:06
Originariamente inviato da Ed_Bunker
Ciao, dovendo realizzare un semplice server che accetti richieste da una pipe ho semplicemente utilizzato una pipe con nome creata dal server stesso, aperta in lettura con l'opzione O_NONBLOCK e poi ho fatto un ciclo del genere:
[...]
E' giusto fare cosi' oppure c'e' un modo per evitare di fare continuamente delle read che restituiscono 0 finche' un qualche client scrive sulla pipe con nome ?! Ad esempio non c'e' la possibilita' di ricevere un segnale quando avviene una scrittura sulla pipe oppure un altro modo cosicche' si possa evitare di sprecare "risorse" ?


Beh se la richiesta e` di dimensione fissa basta una read bloccante classica, e in questo modo non sprecheresti nulla.
Altrimenti penso che select sia quello di cui hai bisogno.

Ed_Bunker
12-07-2004, 01:10
Originariamente inviato da Ikitt
Beh se la richiesta e` di dimensione fissa basta una read bloccante classica, e in questo modo non sprecheresti nulla.
Altrimenti penso che select sia quello di cui hai bisogno.

Se non sbaglio la read e' bloccante solo se la pipe e' "aperta" in scrittura da qualcun altro (Un client...) ma non ci sono dati da leggere. Invece se nessuno l'ha aperta in scrittura, la funzione read(...) ritorna sempre 0 a chi tenta di leggere qualcosa. Ora do un'occhiata alla select(...). :)

Ed_Bunker
12-07-2004, 01:17
Quindi potrei utilizzare la select passandogli il descrittore della pipe sulla quale voglio leggere, attendere (Passivamente) che la funzione ritorni per comunicare un cambiamento di stato della pipe stessa, quindi cominciare a fare delle "normali" read ?!

Loading