Newsgroup: it.comp.lang.c
Titolo: USO DELLA PIPE

Sto lavorando in amb. UNIX.
Ho un problema:
creo una pipe;
un processo fa una lettura su quella pipe;
la trova vuota;
a questo punto il processo aspetta che venga scritto qualcosa ?
grazie a tutti,
N.


Ciao.
Premetto che tutto quello che diro` lo sto citando a memoria e che sono
anni (come minimo dal 1996) che non utilizzo una pipe in un mio programma,
per cui potrei dire cose inesatte.
Per quello che mi ricordo le pipe sono normalmente bloccanti, nel senso
che se un processo tenta di leggere da una pipe e nessun processo ha
provveduto a scrivere, il lettore si blocca all'infinito fino a quando
qualche altro processo non scrive nella pipe. Se tu vuoi evitare che il
lettore si blocchi puoi utilizzare varie soluzioni tra cui:
1 - rendere la pipe non bloccante, utilizzando la funzione ioctl
2 - utilizzare la funzione select prima di eseguire la lettura dalla pipe,
    per sapere se la pipe "contiene" qualche dato che puo` essere letto.
In ogni caso, per questo tipo di problemi un ottimo libro e` secondo me
Stevens: Advanced programming in the Unix environment.
Secondo me questo testo tratta quasi tutto quello che c'e` da sapere
sulla programmazione in ambiente Unix. Dico quasi tutto perche' se ti 
interessa la programmazione di rete c'e` un altro testo
Stevens: Unix network programming (o qualcosa di simile)
Purtroppo non so dirti se ne esistano versioni recenti, ne' se ne esistano
traduzioni in italiano. 
La nota piu` negativa di questi due testi e` comunque costituita dal
fatto che fino a 3-4 anni fa il primo costava 95-100 mila lire ed il secondo
140 150 mila.
Marco Guidi
PS. Vorrei chiedere agli esperti del newsgroup se argomenti come questi 
sono OT.

traduzioni in italiano.
Dello Stevens per la programmazione di rete esiste una traduzione italiana
edita da Jackson, mi pare che il titolo sia "UNIX: programmazione del
software di rete" o qualcosa di simile, prezzo circa 90.000.
Ciao Luciano

N.
Il meccanismo di sincronizzazione delle pipe e' bloccante. Quindi un
processo che legge da una pipe vuota si blocca. Puoi rendere una
lettura (e anche la scrittura)  non bloccante settando il flag
O_NDELAY associato al file descriptor della pipe (usa la funzione
fcntl).
-- 
Guarapito.

Perdonate l'ignoranza, ma cos'è una "PIPE"?
--
Francesco Trotta
http://space.tin.it/computer/ftrotta
Elimina "x_" dal mio indirizzo per mandarmi
un messaggio direttamente

 Perdonate l'ignoranza, ma cos'è una "PIPE"?
Adesso non ho lo Stevens a portata di mano, comunque le pipe sono delle
"strutture" (non mi viene in mente un termine piu` adeguato) 
analoghe ai socket. Le pipe consentono la comunicazione tra processi
che sono in esecuzione sulla stessa macchina (i socket anche tra processi
che sono in esecuzione su macchine diverse).
Per quanto ne so io tutto cio` che riguarda socket, pipe ed altre amenita`
adatte alla programmazione in ambiente multitasking non fa parte dello
standard ISO, ma tali amenita` sono previste dallo standard POSIX.
Per quanto ne so non sarebbe molto agevole programmare in ambiente 
multitasking sfruttando solo cio` che e` messo a disposizione dallo
standard ISO. Anzi, in certi casi non basta nemmeno cio` che e`
previsto dallo standard POSIX; ad esempio nel caso in cui si debbano
scrivere programmi per sistemi operativi orientati al real-time, come
VxWorks, non e` certo agevole scrivere dei programmi che rispettino
gli standard, ammesso che sia possibile.
 
Marco Guidi

"strutture" (non mi viene in mente un termine piu` adeguato) analoghe ai socket. 
Beh, non per fare il pignolo ;), comunque lo dice il nome stesso, sono
dei "condotti", dei canali di comunicazione.
Analogamente a file e socket possiedono un file descriptor, un
processo scrive su pipe un altro processo legge da pipe, (affinche'
cio' sia possibile  i processi devono comunque avere qualche "avo" in
comune).
-- 
Guarapito.