En Unix, la mayoría de los objetos que puede leer y escribir (archivos normales, tuberías, terminales, unidades de disco sin formato) están hechos para parecerse a los archivos.
Un programa como se cat
lee desde su entrada estándar de esta manera:
n = read(0, buffer, 512);
que pide 512 bytes. n
es el número de bytes realmente leídos, o -1 si hay un error.
Si hiciera esto repetidamente con un archivo ordinario, obtendría un montón de lecturas de 512 bytes, luego una lectura algo más corta al final del archivo, luego 0 si intenta leer más allá del final del archivo. Entonces, cat
se ejecutará hasta que n
sea <= 0.
Leer desde una terminal es ligeramente diferente. Después de escribir una línea, terminada por la Entertecla, read
devuelve solo esa línea.
Hay algunos caracteres especiales que puede escribir. Uno es Ctrl-D. Cuando escribe esto, el sistema operativo envía toda la línea actual que ha escrito (pero no la Ctrl-Dpropia) al programa que realiza la lectura. Y aquí está lo fortuito: si Ctrl-Des el primer carácter de la línea, el programa recibe una línea de longitud 0, tal como vería el programa si llegara al final de un archivo ordinario. cat
no necesita hacer nada diferente , ya sea leyendo un archivo ordinario o un terminal.
Otro personaje especial es Ctrl-Z. Cuando lo escribe, en cualquier lugar de una línea, el sistema operativo descarta todo lo que ha escrito hasta ese punto y envía una señal SIGTSTP al programa, que normalmente lo detiene (pausa) y devuelve el control al shell.
Entonces en tu ejemplo
$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+ Stopped cat > file.txt
usted escribió algunos caracteres que fueron descartados, luego cat
fue detenido sin haber escrito nada en su archivo de salida.
$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+ Stopped cat > file.txt
escribió en una línea, que cat
leyó y escribió en su archivo de salida, y luego se Ctrl-Zdetuvo cat
.