Книга: Архитектура операционной системы UNIX
5.5 УКАЗАНИЕ МЕСТА В ФАЙЛЕ, ГДЕ БУДЕТ ВЫПОЛНЯТЬСЯ ВВОД-ВЫВОД — LSEEК
5.5 УКАЗАНИЕ МЕСТА В ФАЙЛЕ, ГДЕ БУДЕТ ВЫПОЛНЯТЬСЯ ВВОД-ВЫВОД — LSEEК
Обычное использование системных функций read и write обеспечивает последовательный доступ к файлу, однако процессы могут использовать вызов системной функции lseek для указания места в файле, где будет производиться ввод-вывод, и осуществления произвольного доступа к файлу. Синтаксис вызова системной функции:
position = lseek(fd, offset, reference);
где fd — дескриптор файла, идентифицирующий файл, offset — смещение в байтах, а reference указывает, является ли значение offset смещением от начала файла, смещением от текущей позиции ввода-вывода или смещением от конца файла. Возвращаемое значение, position, является смещением в байтах до места, где будет начинаться следующая операция чтения или записи. Например, в программе, приведенной на Рисунке 5.10, процесс открывает файл, считывает байт, а затем вызывает функцию lseek, чтобы заменить значение поля смещения в таблице файлов величиной, равной 1023 (с переменной reference, имеющей значение 1), и выполняет цикл. Таким образом, программа считывает каждый 1024-й байт файла. Если reference имеет значение 0, ядро осуществляет поиск от начала файла, а если 2, ядро ведет поиск от конца файла. Функция lseek ничего не должна делать, кроме операции поиска, которая позиционирует головку чтения-записи на указанный дисковый сектор. Для того, чтобы выполнить функцию lseek, ядро просто выбирает значение смещения из таблицы файлов; в последующих вызовах функций read и write смещение из таблицы файлов используется в качестве начального смещения.
#include ‹fcntl.h›
main(argc, argv)
int argc; char *argv[];
{
int fd, skval;
char c;
if (argc != 2) exit();
fd = open(argv[1], O_RDONLY);
if (fd == -1) exit();
while ((skval = read(fd, &c,1 )) == 1) {
printf("char %cn", c);
skval = lseek(fd, 1023L, 1);
printf("new seek val %dn", skval);
}
}
Рисунок 5.10. Программа, содержащая вызов системной функции lseek
- 5.1 OPEN
- 5.2 READ
- 5.3 WRIТЕ
- 5.4 ЗАХВАТ ФАЙЛА И ЗАПИСИ
- 5.5 УКАЗАНИЕ МЕСТА В ФАЙЛЕ, ГДЕ БУДЕТ ВЫПОЛНЯТЬСЯ ВВОД-ВЫВОД — LSEEК
- 5.6 CLOSЕ
- 5.7 СОЗДАНИЕ ФАЙЛА
- 5.8 СОЗДАНИЕ СПЕЦИАЛЬНЫХ ФАЙЛОВ
- 5.9 СМЕНА ТЕКУЩЕГО И КОРНЕВОГО КАТАЛОГА
- 5.10 CМЕНА ВЛАДЕЛЬЦА И РЕЖИМА ДОСТУПА К ФАЙЛУ
- 5.11 STAT И FSTАТ
- 5.12 КАНАЛЫ
- 5.13 DUР
- 5.14 МОНТИРОВАНИЕ И ДЕМОНТИРОВАНИЕ ФАЙЛОВЫХ СИСТЕМ
- 5.15 LINК
- 5.16 UNLINК
- 5.17 АБСТРАКТНЫЕ ОБРАЩЕНИЯ К ФАЙЛОВЫМ СИСТЕМАМ
- 5.18 СОПРОВОЖДЕНИЕ ФАЙЛОВОЙ СИСТЕМЫ
- 5.19 ВЫВОДЫ
- 5.20 УПРАЖНЕНИЯ
- Включение и отключение синхронного вывода
- Где написано сетевое имя компьютера?
- 2. Правила вывода Армстронга
- 3. Производные правила вывода
- 1.6 Драйверы и буферы ввода-вывода
- 1.8 Ввод-вывод типичного приложения хранения данных
- Где я могу найти информацию для дальнейшего обучения?
- Глава 6 BIOS – базовая система ввода-вывода
- 5.2.2.2. Устройства ввода информации в персональный компьютер
- Пример использования шаблона «Выводы – рекомендации»
- Выводы и практические рекомендации
- Где находится клавиша Windows?