Nel precedente articolo abbiamo visto come gestire un canale di I/O con i sockets.
Il linguaggio Tcl supporta però anche una differente gestione del canale di I/O: ovvero è possibile definire a priori sia la dimensione del buffer, da trasmettere o da ricevere, che il suo marcatore di terminazione (che possiamo assimilare al concetto di accapo).
Nota: nei sistemi operativi GNU/Linux e macOS il carattere per l’accapo (new line) è il singolo avanzamento riga (line feed), ovvero il carattere ASCII
\n(valore decimale 10); nel sistema operativo Windows l’accapo è la combinazione dei caratteri ritorno accapo (carriage return), ovvero il carattere ASCII\r(valore decimale 13) e l’avanzamento riga: quindi\r\n.
Ciò significa che, per esempio, il comando gets non dovrà rimanere in attesa che i dati siano disponibili, ma se lo sono li potrà leggere immediatamente, mentre se non lo sono restituirà subito il valore 0 (zero). Questa modalità viene anche denominata non-bloccante (non-blocking mode).
Per lavorare con questo tipo di canali, Tcl mette a disposizione due comandi:
- il comando
fconfigureper definire il comportamento del canale di I/O. - il comando
fblockedper controllare se un canale ha terminato di ricevere tutti i possibili input.
Comando fconfigure
Il comando fconfigure ci permette di definire e di conoscere diversi aspetti di un canale di I/O, tra i più importanti abbiamo:
- la tipologia del canale di I/O: ovvero se utilizzerà o meno i sockets, e nel caso non li utilizzi è possibile configurare:
- la dimensione del buffer;
- il carattere di fine linea.
# Sintassi
fconfigure channel ?param1? ?value1? ?param2 value2 ...?
Nota: se non viene definito alcun valore per i parametri, allora il comando restituisce la lista di quelli di default.
Parametri
Vediamo ora i parametri del comando fconfigure:
blocking– determina se il processo si deve bloccare quando i dati non possono essere spostati sul canale di I/O (per esempio nel caso non vi siano dei dati pronti da leggere o il buffer in scrittura è pieno)buffersize– esprime il numero di bytes che possono essere bufferizzati prima del loro invio o della loro lettura. Il valore deve essere un intero compreso tra 10 e 1000000.translation– imposta il marcatore di terminazione che l’interprete Tcl deve adottare per l’invio di un buffer. I valori ammessi sono:- auto – Tcl adotterà la tipologia di accapo sulla base del sistema operativo in uso.
- binary – in questo caso Tcl considererà il carattere di nuova linea come un qualsiasi altro carattere ASCII: il file o il canale di I/O saranno trattati come flussi binari.
- cr – l’accapo sarà il carattere ASCII di ritorno a capo (questo era il vecchio standard del sistema operativo macOS).
- crlf – l’accapo sarà la combinazione dei caratteri ASCII di ritorno a capo e avanzamento riga (standard del sistema operativo Windows e per i protocolli di rete).
- if – l’accapo sarà il carattere ASCII dell’avanzamento riga (standard del sistema operativo GNU/Linux e oggi anche di macOS).
Comando fblocked
Quando lavoriamo su un canale impostato nella modalità non-bloccante, il comando fblocked ci permette di determinare se vi sono dati disponibili sul canale, o se il canale è stato chiuso dall’altro nodo di rete.
Come utilizzare il comando fblocked
Se abbiamo il nostro Server connesso con più Clients e dobbiamo quindi controllare quali sono pronti per l’Input, allora dobbiamo eseguire questi due passi:
- utilizzeremo il già conosciuto comando
fileeventper intercettare quale canale risulta leggibile (readable) o scrivibile (writable). Una volta verificata questa condizione, il comando chiamerà la procedura dedicata; - nella procedura potremo utilizzare il comando
fblockedper determinare quando sono stati letti tutti i dati (lunghezza0).
Nota
Su questo argomento per il momento ci fermiamo qui, accontentandoci di questa piccola panoramica teorica. Più avanti avremo occasione di vedere un caso d’uso specifico.
Nel prossimo articolo impareremo come mettere in comunicazione il nostro programma con altri programmi.