Архитектура операционной системы UNIX   ::   Бах Морис Дж.

Страница: 162 из 715

Синтаксис вызова системной функции:

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 %c\n", c);

  skval = lseek(fd, 1023L, 1);

  printf("new seek val %d\n", skval);

 }

}

Рисунок 5.10.

|< Пред. 160 161 162 163 164 След. >|

Java книги

Контакты: [email protected]