Чтение онлайн

на главную - закладки

Жанры

UNIX — универсальная среда программирования
Шрифт:

Размер блока на диске для системы на PDP-11 составляет 512 байт и 1024 байта — для VAX.

Доступ нескольких процессоров к одному и тому же файлу в одно и то же время является совершенно законным: в самом деле, один процесс может писать, в то время как другой читает. Это обескураживает, если не входит в ваши планы, но иногда оказывается полезным. Даже несмотря на то, что при одном обращении к функции

read
возвращается 0, который сигнализирует о конце файла, следующий вызов
read
обнаружит наличие некоторого количества байтов, если еще данные пишутся в файл. Это соображение лежит в основе программы
readslow
, которая продолжает читать свой входной поток вне зависимости от того, достигла она конца файла или нет. Программа
readslow
удобна для наблюдения за работой программы.

$ slowprog >temp &

5213
идентификатор процесса

$ readslow <temp | grep something

Иными словами, медленная программа выполняет вывод в файл;

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
.

Упражнение 7.1

Добавьте

readslow
аргумент
n
, так что установленное по умолчанию время паузы может быть изменено на
n
секунд. Некоторые системы обеспечивают флаг
– f
("навсегда") для
tail
, которая объединяет функции
tail
и
readslow
. Прокомментируйте этот вариант.

Упражнение 7.2

Что происходит с

readslow
, если читаемый файл обрывается? Как бы вы исправили ситуацию? Подсказка: читайте о
fstat
в разд. 7.3.

Создание файла:
open
,
creat
,
close
,
unlink

Все стандартные файлы, кроме установленных по умолчанию, — входной, выходной и файл диагностики вы должны явно открыть для чтения или записи. Это можно сделать с помощью двух системных вызовов — открыть и создать [14] .

Функция

open
весьма похожа на fopen из предыдущей главы, за исключением того, что вместо указателя файла она возвращает дескриптор файла, имеющий тип
int
.

14

Однажды К. Томпсона спросили, что бы он хотел изменить, если бы ему пришлось заново конструировать систему UNIX. Он ответил: "Я бы написал

creat
с е."

char *name;

int fd, rwmode;

fd = open(name, rwmode);

Как и для

fopen
, аргумент
name
есть символьная строка, содержащая имя файла. Аргумент вида доступа, однако, другой:
rwmode
равен 0 для чтения, 1 — для записи, 2 — в том случае, когда нужно открыть файл для чтения и записи. При вызове
open
возвращается -1, если возникает какая-либо ошибка; иначе возвращается корректный дескриптор файла.

Попытка открыть несуществующий файл является ошибкой. Системный вызов

creat
позволяет создать новые файлы или переписать старые.

int perms;

fd = creat(name, perms);

Вызов

creat
возвращает дескриптор файла, если можно создать файл name, и -1 в противном случае. Если файл не существует,
creat
создает его с правами доступа, определяемыми аргументом
perms
. Существующий файл
creat
сокращает до нулевой длины, т.е. применение
creat
к уже существующему файлу не является ошибкой (права доступа при этом не изменяются). Безотносительно к правам доступа файл, к которому было обращение
creat
, открыт для записи.

Как известно из второй главы, с файлом связаны девять битов информации о защите, контролирующих разрешение на чтение, запись или выполнение, так что число из трех восьмеричных цифр удобно для спецификации этой информации. Например, 0755 дает разрешение владельцу файла читать, писать и выполнять его, а чтение и выполнение файла доступно любому пользователю. Не забывайте о первом нуле, который определяет восьмеричные числа в языке Си.

Иллюстрацией изложенного может служить упрощенная версия

cp
. Ее главный недостаток состоит в том, что она копирует только один файл и не разрешает использовать в качестве второго аргумента каталог. Кроме того, наша версия не сохраняет права доступа файла-источника; в дальнейшем мы покажем, как это исправить.

/* cp: minimal version */

#include <stdio.h>

#define PERMS 0644 /* RW for owner, R for group, others */

char *progname;

main(argc, argv) /* cp: copy f1 to f2 */

 int argc;

 char *argv[];

{

 int f1, f2, n;

 char buf[BUFSIZ];

 progname = argv[0];

 if (argc != 3)

error("Usage: %s from to", progname);

 if ((f1 = open(argv[1], 0)) == -1)

error("can't open %s", argv[1]);

 if ((f2 = creat(argv[2], PERMS)) == -1)

error("can't create %s", argv[2]);

 while ((n = read(f1, buf, BUFSIZ)) > 0)

if (write(f2, buf, n) != n)

 error("write error", (char*)0);

Поделиться:
Популярные книги

Наследие Маозари 9

Панежин Евгений
9. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
сказочная фантастика
6.25
рейтинг книги
Наследие Маозари 9

Последний Паладин. Том 3

Саваровский Роман
3. Путь Паладина
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 3

Возвращение

Кораблев Родион
5. Другая сторона
Фантастика:
боевая фантастика
6.23
рейтинг книги
Возвращение

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.25
рейтинг книги
Дважды одаренный. Том VI

Искушение чародея (сборник)

Булычев Кир
Фантастика:
научная фантастика
космическая фантастика
6.20
рейтинг книги
Искушение чародея (сборник)

АН (цикл 11 книг)

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
АН (цикл 11 книг)

Надуй щеки!

Вишневский Сергей Викторович
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки!

Кондотьер

Листратов Валерий
7. Ушедший Род
Фантастика:
фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Кондотьер

Неучтенный элемент. Том 6

NikL
6. Антимаг. Вне системы
Фантастика:
фэнтези
5.25
рейтинг книги
Неучтенный элемент. Том 6

Французская новелла XX века. 1900–1939

Пруст Марсель
Проза:
классическая проза
6.25
рейтинг книги
Французская новелла XX века. 1900–1939

Охотник за головами

Вайс Александр
1. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Охотник за головами

Третий. Том 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 3

Бастард Императора. Том 5

Орлов Андрей Юрьевич
5. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 5

Забытые боги

Рокотов Алексей
4. Путь князя
Фантастика:
фэнтези
рпг
попаданцы
5.00
рейтинг книги
Забытые боги