Successivo: Proseguire dopo errore in input, Precedente: Getline, Su: Leggere file [Contenuti][Indice]
Questa
sezione descrive una funzionalità disponibile solo in
gawk
.
Si può specificare un tempo limite in millisecondi per leggere l’input dalla
tastiera, da una pipe o da una comunicazione bidirezionale, compresi i
socket TCP/IP. Questo può essere fatto per input, per comando o per
connessione, impostando un elemento speciale nel vettore PROCINFO
(vedi la sezione Variabili predefinite con cui awk
fornisce informazioni):
PROCINFO["nome_input", "READ_TIMEOUT"] = tempo limite in millisecondi
Se è impostato, gawk
smette di attendere una risposta e restituisce
insuccesso se non sono disponibili dati da leggere entro il limite di tempo
specificato. Per esempio, un cliente TCP può decidere di abbandonare se
non riceve alcuna risposta dal server dopo un certo periodo di tempo:
Service = "/inet/tcp/0/localhost/daytime" PROCINFO[Service, "READ_TIMEOUT"] = 100 if ((Service |& getline) > 0) print $0 else if (ERRNO != "") print ERRNO
Qui vediamo come ottenere dati interattivamente dall’utente26 aspettando per non più di cinque secondi:
PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 5000 while ((getline < "/dev/stdin") > 0) print $0
gawk
termina l’operazione di lettura se l’input non
arriva entro il periodo di tempo limite, restituisce insuccesso
e imposta ERRNO
a una stringa di valore adeguato.
Un valore del tempo limite negativo o pari a zero equivale a non specificare
affatto un tempo limite.
Si può impostare un tempo limite anche per leggere dalla tastiera nel ciclo implicito che legge i record in input e li confronta coi criteri di ricerca, come:
$ gawk 'BEGIN { PROCINFO["-", "READ_TIMEOUT"] = 5000 } > { print "You entered: " $0 }' gawk -| You entered: gawk
In questo caso, la mancata risposta entro cinque secondi dà luogo al seguente messaggio di errore:
error→ gawk: riga com.:2: (FILENAME=- FNR=1) fatale: errore leggendo error→ file in input `-': Connessione scaduta
Il tempo limite può essere impostato o cambiato in qualsiasi momento, e avrà effetto al tentativo successivo di leggere dal dispositivo di input. Nel seguente esempio, partiamo con un valore di tempo limite di un secondo e lo riduciamo progressivamente di un decimo di secondo finché l’attesa per l’input diventa illimitata.
PROCINFO[Service, "READ_TIMEOUT"] = 1000 while ((Service |& getline) > 0) { print $0 PROCINFO[Service, "READ_TIMEOUT"] -= 100 }
NOTA: Non si deve dare per scontato che l’operazione di lettura si blocchi esattamente dopo che è stato stampato il decimo record. È possibile che
gawk
legga e tenga in memoria i dati di più di un record la prima volta. Per questo, cambiare il valore del tempo limite come nell’esempio appena visto non è molto utile.
Se l’elemento di PROCINFO
non è presente e la variabile d’ambiente
GAWK_READ_TIMEOUT
esiste,
gawk
usa il suo valore per inizializzare il valore di tempo limite.
L’uso esclusivo della variabile d’ambiente per specificare il tempo limite
ha lo svantaggio di non essere
adattabile per ogni comando o per ogni connessione.
gawk
considera errore un superamento di tempo limite anche se
il tentativo di leggere dal dispositivo sottostante potrebbe riuscire
in un tentativo successivo. Questa è una limitazione, e inoltre
significa che non è possibile usarlo per ottenere input multipli,
provenienti da due o più sorgenti. Vedi la sezione Elaborare ulteriore input dopo certi errori di I/O
per una modalità che consente di tentare ulteriori operazioni di I/O.
Assegnare un valore di tempo limite previene un blocco a tempo indeterminato
legato a operazioni di lettura. Si tenga però presente che ci sono altre
situazioni in cui gawk
può restare bloccato in attesa che un
dispositivo di input sia pronto. Un cliente di rete a volte può impiegare
molto tempo per stabilire una
connessione prima di poter iniziare a leggere qualsiasi dato,
oppure il tentativo di aprire un file speciale FIFO in lettura può bloccarsi
indefinitamente in attesa che qualche altro processo lo apra in scrittura.
Successivo: Proseguire dopo errore in input, Precedente: Getline, Su: Leggere file [Contenuti][Indice]