Чтение и запись порциями, подходящими для диска, будут наиболее эффективными, но даже ввод-вывод по одному символу за раз осуществим для умеренных объемов буферизуются ядром. Дороже всего обходятся обращения к системе. Программа ed
, например, использует однобайтовый способ, чтобы читать стандартный входной поток. Мы хронометрировали работу данной версии cat для файла в 54 000 байт при шести значениях SIZE
:
Время (пользователь+система, в сек.)
Размер | PDP-11/40 | VAX-11/750 |
---|---|---|
1 | 271.0 | 188.8 |
10 | 29.9 | 19.3 |
100 | 3.8 | 2.6 |
512 | 1.3 | 1.0 |
1024 | 1.2 | 0.6 |
5120 | 1.0 | 0.6 |
Размер блока на диске для системы на PDP-11 составляет 512 байт и 1024 байта — для VAX.
Доступ нескольких процессоров к одному и тому же файлу в одно и то же время является совершенно законным: в самом деле, один процесс может писать, в то время как другой читает. Это обескураживает, если не входит в ваши планы, но иногда оказывается полезным. Даже несмотря на то, что при одном обращении к функции read
возвращается 0, который сигнализирует о конце файла, следующий вызов read
обнаружит наличие некоторого количества байтов, если еще данные пишутся в файл. Это соображение лежит в основе программы readslow
, которая продолжает читать свой входной поток вне зависимости от того, достигла она конца файла или нет. Программа readslow
удобна для наблюдения за работой программы.
$ slowprog >temp &
5213
идентификатор процесса
$ readslow
Иными словами, медленная программа выполняет вывод в файл; readslow
, возможно, совместно с некоторыми другими программами "наблюдает", как накапливаются данные.
По составу readslow
идентична cat, за исключением того, что она зацикливается, а не завершается, когда встречает конец входного потока. Программа readslow
должна использовать ввод-вывод низкого уровня, так как стандартная библиотечная функция продолжает выдавать EOF
после первого конца файла.
/* readslow: keep reading, waiting for more */
#define SIZE 512 /* arbitrary */
main() {
char buf[SIZE];
int n;
for (;;) {
while ((n = read(0, buf, sizeof buf)) > 0)
write(1, buf, n);
sleep(10);
}
}
Функция sleep
заставляет программу остановиться на определенное число секунд (см. справочное руководство по sleep(3)
). Мы не хотим, чтобы программа долго занималась поиском дополнительных данных, так как на это расходуется время центрального процессора. Таким образом, наша версия readslow
копирует свой входной поток до конца файла, "спит" какое-то время, затем снова возобновляет работу. Если пока она была "в паузе", пришли еще данные, они будут прочитаны следующим read
.
Добавьте readslow
аргумент n
, так что установленное по умолчанию время паузы может быть изменено на n
секунд. Некоторые системы обеспечивают флаг -f
("навсегда") для tail
, которая объединяет функции tail
и readslow
. Прокомментируйте этот вариант.
Что происходит с readslow
, если читаемый файл обрывается? Как бы вы исправили ситуацию? Подсказка: читайте о fstat
в разд. 7.3.
open
, creat
, close
, unlink
Все стандартные файлы, кроме установленных по умолчанию, — входной, выходной и файл диагностики вы должны явно открыть для чтения или записи. Это можно сделать с помощью двух системных вызовов — открыть и создать[14].
Функция open
весьма похожа на fopen из предыдущей главы, за исключением того, что вместо указателя файла она возвращает дескриптор файла, имеющий тип int
.
char *name;
int fd, rwmode;
fd = open(name, rwmode);
Как и для fopen
, аргумент name
есть символьная строка, содержащая имя файла. Аргумент вида доступа, однако, другой: rwmode
равен 0 для чтения, 1 — для записи, 2 — в том случае, когда нужно открыть файл для чтения и записи. При вызове open
возвращается -1, если возникает какая-либо ошибка; иначе возвращается корректный дескриптор файла.
Попытка открыть несуществующий файл является ошибкой. Системный вызов creat
позволяет создать новые файлы или переписать старые.
int perms;
fd = creat(name, perms);
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии