У Unix більшість об'єктів, які ви можете читати і записувати - звичайні файли, труби, термінали, необроблені дискові диски - всі вони нагадують файли.
Така програма, як cat
читає зі свого стандартного вводу, виглядає так:
n = read(0, buffer, 512);
який запитує 512 байт. n
- кількість дійсно прочитаних байтів, або -1, якщо є помилка.
Якщо ви робили це неодноразово зі звичайним файлом, ви отримаєте купу 512-байтних читань, потім дещо коротше читання в кінці файлу, а потім 0, якщо ви намагалися прочитати минулий кінець файлу. Отже, cat
буде працювати до тих пір, поки не n
буде <= 0.
Читання з терміналу дещо відрізняється. Після введення рядка, закінченого Enterключем, read
повертає саме цей рядок.
Ви можете набрати кілька спеціальних символів. Один є Ctrl-D. Коли ви вводите це, операційна система надсилає всю поточну лінію, яку ви ввели (але не Ctrl-Dсаму) програмі, яка виконує зчитування. І ось найсмішніша річ: якщо Ctrl-Dце перший символ у рядку, програмі надсилається рядок довжиною 0 - подібно до того, як програма побачила б, чи просто вона потрапила до кінця звичайного файлу. cat
не потрібно нічого робити інакше , чи читає він із звичайного файлу чи терміналу.
Ще один особливий персонаж Ctrl-Z. Коли ви вводите його в будь-якому місці рядка, операційна система відкидає все, що ви ввели до цього моменту, і надсилає програмі сигнал SIGTSTP, який, як правило, зупиняє (призупиняє) його і повертає управління оболонці.
Так у вашому прикладі
$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+ Stopped cat > file.txt
ви набрали кілька символів, які були відкинуті, а потім cat
були зупинені, не написавши нічого у вихідний файл.
$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+ Stopped cat > file.txt
ви ввели один рядок, який cat
читав і записував у його вихідний файл, а потім Ctrl-Zзупинявся cat
.