Successivo: , Precedente: , Su: Leggere file   [Contenuti][Indice]


4.11 Leggere input entro un tempo limite

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.


Note a piè di pagina

(26)

Questo presuppone che lo standard input provenga dalla tastiera.


Successivo: , Precedente: , Su: Leggere file   [Contenuti][Indice]