Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция2013.docx
Скачиваний:
7
Добавлен:
31.03.2015
Размер:
72.11 Кб
Скачать

1.2.7. Установка указателя в файле. Системный вызов lseek().

Прототип системного вызова:

#include <sys/types.h>

#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

Описание системного вызова

Системный вызов lseek предназначен для изменения положения указателя текущей позиции в открытом регулярном файле.

Параметр fd является дескриптором соответствующего файла, т. е. значением, которое вернул системный вызов open().

Параметр offset совместно с параметром whence определяют новое положение указателя текущей позиции следующим образом:

- если значение параметра whence равно SEEK_SET, то новое значение указателя будет составлять offset байт от начала файла.

- если значение параметра whence равно SEEK_CUR, то новое значение указателя будет составлять старое значение указателя + offset байт.

Если значение параметра whence равно SEEK_END, то новое значение указателя будет составлять длина файла + offset байт.

Естественно, что новое значение указателя не должно стать отрицательным.

Системный вызов lseek позволяет выставить текущее значение указателя за конец файла (т.е. сделать его превышающим размер файла). При любой последующей операции записи в этом положении указателя файл будет выглядеть так, как будто возникший промежуток был заполнен нулевыми битами.

Тип данных off_t обычно является синонимом типа long.

Возвращаемые значения

Системный вызов возвращает новое положение указателя текущей позиции в байтах от начала файла при нормальном завершении и значение -1 при возникновении ошибки.

Пример 5

1.2.8. Дублирование существующего файлового дескриптора. Системный вызов dup().

Функция dup() используется для дублирования существующего файлового дескриптора:

Прототип системного вызова:

int dup(int fildes);

Описание системного вызова

Файловый дескриптор fildes должен быть предварительно получен с по­мощью функций ореп(), creat(), dup(), или pipe(). В случае ус­пешного завершения функции dup() возвращается новый файловый деск­риптор, свойства которого идентичны свойствам дескриптора fildes. Оба указывают на один и тот же файл, одно и то же смещение, начиная с ко­торого будет производиться следующая операция чтения или записи (файловый указатель), и определяют один и тот же режим работы с фай­лом. Правило размещения нового файлового дескриптора аналогично ис­пользуемому в функции ореn().

1.2.9. Создание однонаправленного канала. Системный вызов pipe().

Прототип системного вызова:

#include <unistd.h>

int pipe(int fildes[2]);

Описание системного вызова

Функция pipe() служит для создания однонаправленного (симплексного) канала (также называемого анонимным каналом) обмена данными между двумя родственными процессами. Дело в том, что только родственные процессы (например, родительский и дочерний) имеют возможность получить доступ к одному и тому же каналу.

Функция возвращает два файловых дескриптора в массиве fildes [], причем fildes [0] служит для чтения данных из канала, a fildes [1] — для записи данных в канал.

Каналы являются одним из способов организации межпроцессного взаимодействия. В качестве примера использования pipe() можно привести возможность командного интерпретатора — создание программных каналов.

Отметим, что буферизация данных в канале стандартно осуществляется путем выделения дискового пространства в структуре файловой системы. Таким образом, чтение и запись в канал связаны с дисковым вводом/выводом, что, безусловно, сказывается на производительности этого механизма. Современные операционные системы наряду с более совершенными средствами межпроцессного взаимодействия предлагают и более эффективные механизмы каналов. Так, например, SCO UNIX (OpenServer 5.0) обеспечивает работу каналов через специальную файловую систему — HPPS (High Performance Pipe System). С помощью HPPS данные буферизируются в оперативной памяти, что существенно ускоряет операции записи и чтения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]