PDA

View Full Version : [C] Dubbietto su pipe...


Ed_Bunker
26-06-2004, 17:08
Ciao, vorrei un chiarimento su una tipica situazione di utilizzo delle pipe:

supponiamo di avere una pipe con nome e poi due processi: un lettore ed uno scrittore. Lo scrittore invia sulla pipe una stringa di 20 caratteri. (Pipe gia' aperte con i diritti "idonei"...)
Lo scrittore fara':

...
char buffer[] = "LivingAfter Midnight";
if (write("nomepipe.p", buffer, strlen(buffer)) != strlen(buffer))
{
perror("Errore nella write");
exit(-1);
}
/*A questo punto nella pipe ci sono 20 caratteri pronti per essere letti*/
...

Il lettore "dall'altro capo della pipe" li riceve. Nel caso faccia:

...
char buffer[20];
read("nomepipe.p", buffer, strlen(buffer);
...

sapendo che ci sono esattamente 20 caratteri da leggere ho la certezza che la lettura di tali caratteri avverra' in un sol colpo ovvero con una sola read(...) (Come sopra) oppure potrebbero servire 2 o piu' read(...) ?!?! Ad esempio potrebbe accadere che sia necessario leggere prima 12 caratteri e poi leggerne altri 8 pur avendo specificato alla read(...) che sono disposto a leggere sino a 20 caratteri in un colpo solo ?!?

thks :D

ilsensine
28-06-2004, 10:48
Nel tuo caso dovrebbero essere letti in un sol colpo. Nota che non puoi comunque fare assunzioni su questo: sicuramente se trasferisci più di 4096 byte, la lettura deve essere fatta in più passi (e la scrittura rischia di essere bloccante). Per trasferimenti < 4096 la read dovrebbe essere unica, per come funzionano le pipe, ma lo standard non te lo garantisce.

ilsensine
28-06-2004, 10:59
Argh...
Originariamente inviato da Ed_Bunker

char buffer[20];
read("nomepipe.p", buffer, strlen(buffer);



UCCIDI quello strlen, disgraziato! :D

Ed_Bunker
28-06-2004, 11:25
Originariamente inviato da ilsensine
Argh...


UCCIDI quello strlen, disgraziato! :D

Perche' ? Non devo passare anche il numero di bytes da scrivere?!? Un char e' 1 byte percio' la lunghezza della stringa dovrebbe indicare il numero di bytes esatti da scrivere. Dov'e' la disgrazia !??

thks

ilsensine
28-06-2004, 11:33
Quant'è la lunghezza della stringa contenuta in buffer, se ancora non ci hai scritto nulla?

VICIUS
28-06-2004, 11:39
Originariamente inviato da Ed_Bunker
Perche' ? Non devo passare anche il numero di bytes da scrivere?!? Un char e' 1 byte percio' la lunghezza della stringa dovrebbe indicare il numero di bytes esatti da scrivere. Dov'e' la disgrazia !??

thks
Penso che quello che intende ilsensine è che qui c'è un buffer overflow grosso quanto una casa. :D

Un strlen su un array di char non ancora inizializzato non ritorna mai la lunghezza del array. Non sai che cosa c'è in memoria e quindi non puoi sapere che valore ritorna la strlen.

ciao ;)

Ed_Bunker
28-06-2004, 12:08
Originariamente inviato da VICIUS
Penso che quello che intende ilsensine è che qui c'è un buffer overflow grosso quanto una casa. :D

Un strlen su un array di char non ancora inizializzato non ritorna mai la lunghezza del array. Non sai che cosa c'è in memoria e quindi non puoi sapere che valore ritorna la strlen.

ciao ;)

Vero, vero... il problema e' che ho fatto il "vecchio" copia e incolla prendendo i parametri dalla write mentre, in realta', quando faccio la read indico esplicitamente il massimo numero di bytes che sono disposto a leggere. In questo caso 20.

Sorry.