Среда, 21.08.2019, 17:45
Приветствую Вас, Гость
Главная » 2012 » Август » 28 » Позиционное чтение и запись
11:13
Позиционное чтение и запись

Вместо вызова 1 seek ( ) можно использовать два существующих в Linux варианта

системных вызовов — readO и wn teO, принимающих в качестве одного из



параметров позицию в файле, с которой должны начинаться чтение или запись.

После завершения работы они не обновляют позицию в файле.

Вариант вызова read() называется preadO:

%23define XOPENSOURCE 500

%23include <unistd.h>

ssize t pread (int fd. void *buf, s iz e t count, off t pos);

Этот вызов считывает из файла, переданного при помощи дескриптора файла

fd, до count байтов в буфер buf, начиная с позиции в файле pos.

Вариант вызова w r ite ( ) называется pwriteO:

%23define _X0PEN_S0URCE 500

%23include <unistd.h>

ssize t pwrite (int fd, const void *buf. size t count, off t pos):

Этот вызов записывает в файл, переданный при помощи дескриптора файла

fd, до count байтов из буфера buf, начиная с позиции в файле pos.

Поведение этих вызовов практически идентично их собратьям без буквы р

в начале названия, за исключением того, что они полностью игнорируют текущую

позицию в файле; вместо того чтобы использовать ее, они начинают работу

с позиции, содержащейся в аргументе pos. Помимо этого, по завершении они

не обновляют позицию в файле. Другими словами, вызовы readO и wr iteO могут

потенциально вредить работе позиционных вызовов, если перемешивать

эти два вида в коде программы.

Оба позиционных вызова можно использовать только с дескрипторами файлов,

поддерживающих поиск. Они обеспечивают семантику, схожую с применением

перед вызовом readO или wr iteO вызова lseekO, но с тремя отличиями.

Во-первых, эти вызовы проще в использовании, особенно при выполнении таких

хитрых операций, как перемещение по файлу назад или случайным образом.

Во-вторых, они не обновляют указатель в файле после завершения. Наконец,

самое главное, они позволяют избегать условий состязания, которые могут

возникать при использовании lseekO. Если несколько потоков выполнения одновременно

работают с одним дескриптором файла, то сразу же после того, как

первый поток сделает вызов lseekO, второй поток в той же программе может

успеть обновить позицию в файле, и тогда, когда первый поток выполнит операцию

считывания или записи, это будет сделано совсем в другом месте, а не

в том, которое планировалось изначально. Избежать таких ситуаций можно,

применив системные вызовы preadO и pwriteO.


порно ролики негритянки бесплатно
Просмотров: 2484 | Добавил: piligrim | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: