PIPE
Flusso = PIPE NomePipe FOR [ READ ] [ WRITE ] [ WATCH ]
Apre una pipe con nome per la lettura, la scrittura o entrambe. Se la pipe non esiste allora sarà automaticamente creata.
Una pipe esegue a un flusso unidirezionale di comunicazione fra processi sullo stesso sistema. In altre parole, questi flussi sono half-duplex, quindi il flusso è in una sola direzione.
Una delle principali caratteristiche di una pipe è che i dati che vi scorrono attraverso sono a carattere transitorio. Cioé dati che una volta letti dal descrittore di lettura non possono essere letti di nuovo.
Inoltre, se scriviamo continuamente i dati nel descrittore, allora saremo in grado di leggere i dati solo nell'ordine in cui essi sono stati scritti.
Tuttavia, una pipe deve essere aperta a entrambe le direzioni contemporaneamente prima di poter procedere a fare qualsiasi operazione sia in ingresso che in uscita. L'apertura di una pipe per la lettura di norma si blocca fino a che qualche altro processo apra la stessa pipe per la scrittura.
Gambas implementa una pipe di tipo FIFO(First-In, First-out), cioè il primo dato che entra è il primo che esce. Per maggiori informazioni date uno sguardo a MKFIFO nelle pagine del manuale Linux/ Unix.
-
Se la parola chiave
READ
viene specificata, allora la pipe viene aperta in lettura.
-
Se la parola chiave
WRITE
viene specificata, allora la pipe viene aperta in scrittura.
-
Se la parola chiave
WATCH
viene specificata, la pipe viene vista dall'interprete come:
-
Se alla alla fine della pipe può essere letto un byte, allora viene chiamato l'evento
Pipe_Read()
.
-
Se alla alla fine della pipe può essere scritto un byte, allora viene chiamato l'evento
Pipe_Write()
.
Se la pipe viene aperta con successo, un'oggetto (object) stream viene restituito nella variabile
Flusso.
Attenzione! Gli streams sono sempre bufferizzati.
Errori
Messaggio
|
Descrizione
|
Access forbidden (43)
|
L'accesso richiesto per la pipe non è consentito,
o il permesso di ricerca è negato per una delle
directory se nel percorso specifico, oppure l'accesso in scrittura alla directory padre non è permessa.
|
Device is full (37)
|
Non è stato possibile creare il file su cui NomePipe avrebbe dovuto scriverci per mancanza di spazio.
|
Not a directory (49)
|
A componenti NomePipe viene usata come una directory ma non è una directory.
|
System error... (42)
|
Altri possibili errori si sistema:
-
troppi link simbolici sono stati riscontrati nella risoluzione del percorso.
-
La lunghezza dell'argomento percorso, eccede il massimo della lunghezza ammissibile per il nome del percorso specificato.
-
Un componenti del nome del percorso specificato non corrisponde ad una directory, oppure è una stringa vuota.
-
La directory che dovrebbe contenere il nuovo file, non può essere estesa, o il filesiystem non può allocare risorse.
-
E' stato raggiunto il limite massimo dei files aperti.
-
NomePipe fa riferimento ad un file a sola lettura, mentre viene chiesta al filesystem una scrittura.
|
Esempi
' Stampa i messaggi inviati a una pipe.
' Fai girare questo codice in un modulo, quindi da terminale dai : ls > /tmp/FIFO1
Dim hFile AS File
Dim sLine AS String
hFile = Pipe "/tmp/FIFO1" For Read
Do
Read #hFile, sLine, -256
If Not sLine Then Break
Print sLine;
Loop
' Un altro modo di leggere una pipe se si sa che i dati sono una sequenza di righe di testo.
Dim hFile As File
Dim sLine As String
hFile = Pipe "/tmp/FIFO1" For Read
Do
Line Input #hFile, sLine
If hFile.EndOfFile Then Break
Print sLine
Loop
Vedi anche