In Unix, la maggior parte degli oggetti che è possibile leggere e scrivere - normali file, pipe, terminali, unità disco non elaborate - sono tutti realizzati per assomigliare ai file.
Un programma come cat
legge dal suo input standard in questo modo:
n = read(0, buffer, 512);
che richiede 512 byte. n
è il numero di byte effettivamente letti o -1 se si verifica un errore.
Se lo facessi ripetutamente con un normale file, otterrai un sacco di letture da 512 byte, quindi una lettura un po 'più breve alla fine del file, quindi 0 se provassi a leggere oltre la fine del file. Quindi, cat
verrà eseguito fino a quando n
<= 0.
La lettura da un terminale è leggermente diversa. Dopo aver digitato una riga, terminata dalla Enterchiave, read
restituisce solo quella riga.
Ci sono alcuni caratteri speciali che puoi digitare. Uno è Ctrl-D. Durante la digitazione, il sistema operativo invia tutta la riga corrente digitata (ma non la Ctrl-Dstessa) al programma che esegue la lettura. Ed ecco la cosa fortuita: se Ctrl-Dè il primo carattere sulla linea, al programma viene inviata una linea di lunghezza 0 - proprio come il programma vedrebbe se arrivasse alla fine di un normale file. cat
non deve fare nulla di diverso , sia che si tratti di leggere da un file ordinario o di un terminale.
Un altro personaggio speciale è Ctrl-Z. Quando lo digiti, ovunque in una riga, il sistema operativo scarta qualsiasi cosa tu abbia scritto fino a quel punto e invia un segnale SIGTSTP al programma, che normalmente lo ferma (mette in pausa) e restituisce il controllo alla shell.
Quindi nel tuo esempio
$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+ Stopped cat > file.txt
hai digitato alcuni caratteri che sono stati scartati, quindi è cat
stato interrotto senza aver scritto nulla nel suo file di output.
$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+ Stopped cat > file.txt
hai digitato in una riga, che cat
leggeva e scriveva nel suo file di output, e poi l' Ctrl-Zarresto cat
.