Главная » 2016 » Март » 28 » Позиционное чтение и запись
12:09
Позиционное чтение и запись
Вместо вызова 1 seek ( ) можно использовать два существующих в Linux вариантасистемных вызовов — readO и wn teO, принимающих в качестве одного изпараметров позицию в файле, с которой должны начинаться чтение или запись.После завершения работы они не обновляют позицию в файле.Вариант вызова read() называется preadO:#define XOPENSOURCE 500#include <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:#define _X0PEN_S0URCE 500#include <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.
Просмотров: 425 | Добавил: admin | Рейтинг: 0.0/0
Всего комментариев: 0
avatar