C Програмиране

Функция за четене POSIX в C Програмиране

Функция за четене POSIX в C Програмиране
В традиционните POSIX съвместими операционни системи, за да получи информация от документ, съдържащ се във файлова система, програма използва прочетеното системно повикване. Дескриптор на документ, до който обикновено се осъществява достъп от предишно повикване за отваряне, се дефинира от файла. Това системно повикване за четене отчита информацията в байтове и цялото число, което повикващият посочва от документа, и след това я записва в буфер, предоставен от извикващия механизъм.

Определение на функцията

Преди да дефинирате функцията за четене във вашия код, трябва да включите някои необходими пакети.

#include

Ето как дефинирате функцията за четене POSIX:

>> ssize_t pread (int fildes, void * buf, size_t nbyte, off_t offset);
>> ssize_t четене (int fd, void * buf, size_t nbytes);

Три аргумента на параметър могат да бъдат взети от извикването на метода за четене:

int fd: Файловият дескриптор на файла, откъдето трябва да се прочете информацията. Може да използваме дескриптор на файлове, придобити чрез отворено системно повикване, или просто да използваме 0, 1 или 2, отнасящи се до типичен вход, редовен изход или редовна грешка, съответно.

Празно * buf: Буферът или масивът от знаци, в които прочетените данни трябва да се запазват и съхраняват.

Размер_т нбайт: Броят на байтовете, които трябва да бъдат прочетени от документа, преди да се съкратят. Цялата информация може да се съхранява в буфера, ако информацията за четене е по-кратка от nbytes.

Описание

Методът read () се опитва да прочете байта „nbyte“ в буферния кеш, посочен от „buf“, или от файла, свързан с дескриптора на отворен документ „Fildes“ или „fd“. Той не определя естеството на няколко едновременни четения в един и същ поток, FIFO или терминална единица.

При документи, които позволяват четенето, процесът на четене започва с отместването на документа и отместването се увеличава с броя на прочетените байтове. Ако изместването на документа е на или извън ръба на файла, няма прочетени байтове и read () не дава никакви.

Когато броят е 0, read () ще разпознае грешките, споменати по-долу. Ако няма грешки или ако read () не се отчита с грешки, read () дава нула с брой 0 и следователно няма други последици.

Ако броят е по-висок от SSIZE_MAX, според POSIX.1, тогава резултатът се определя от изпълнението.

Върната стойност

Числото на байтовете 'read' и 'pread', върнато след постигане, трябва да е неотрицателно цяло число, докато нулата сочи към края на файла. Позицията на документа се прогресира от този номер или в противен случай, за да означава грешка, методите връщат -1 и присвояват 'errno'. Когато тази цифра е по-малка от броя на поисканите байтове, това не е грешка в байта. Възможно е засега да са налични по-малко байтове.

Грешки

Функцията за предварително и четене ще бъде неуспешна, ако възникнат тези грешки:

EAGAIN:

Дескрипторът на документа или файла „fd“ принадлежи на не-сокет файл, който е означен като неблокиращ (O NONBLOCK) и ще блокира четенето.

EWOULDBLOCK:

Дескрипторът 'fd' принадлежи на сокет, който е означен като неблокиращ (O_NONBLOCK) и ще блокира четенето.

EBADF:

„Fd“ може да не е използваем дескриптор или да не е отворен за четене.

ЕФАЛТ:

Това се случва, когато вашият „buf“ е извън вашето достъпно адресно пространство.

EINTR:

Преди четенето на информационни данни разговорът може да е прекъснат от сигнал.

EINVAL:

Тази грешка възниква, когато дескрипторът ви „fd“ е включен в обект, който не е подходящ за четене, или документът е развързан с флага O_DIRECT и един или другият адрес, посочен в „buf“, стойността е посочена в „count ', или изместването на документа не е подходящо свързано.

EINVAL:

Дескрипторът „fd“ може да е бил формиран с помощта на извикване на timerfd_create (2) и е даден четене на неправилен размер на буфера.

EIO:

Това е грешка при въвеждане / извеждане. Това се случва, когато фоновата група процеси се опитва да чете от нейния регулаторен терминал и едната или другата пренебрегва или блокира SIGTTIN, или нейната група процеси е загубена. Друга причина за тази грешка може да бъде грешка при вход / изход на ниско ниво, междувременно четене от твърд диск или лента. Друга потенциална причина за EIO за мрежови файлове с данни е премахването на консултативното заключване на дескриптора на файла и неуспехът на това заключване.

EISDIR:

Файловият дескриптор 'fd' принадлежи към директория.

Бележки:

Могат да възникнат и много други грешки, зависещи от обекта, свързан с дескриптора „fd“. Формите size_t и ssize_t са немаркирани и маркирани числови типове данни, дефинирани от POSIX.1. В Linux най-много 0x7ffff000 (2,147,479,552) байта могат да бъдат предадени чрез функция за четене (и еквивалентни системни повиквания), връщайки броя на първоначално предадените байтове (както на 32-битова, така и на 64-битова платформи). С файловите системи NFS, само в първия момент, когато клеймото за време се променя чрез четене на малки потоци информация, последващите повиквания не биха го направили. Той се задейства от кеширане на атрибути от страна на клиента, тъй като, макар и не всички, клиентите на NFS се отказват от актуализиране на сървъра чрез st_atime (време на последния достъп до файл) и клиентските четения, изпълнени от буфера на клиента, няма да предизвикат промени в st- atime на сървъра, тъй като няма налични показания от страна на сървъра. Чрез премахване на кеширането на атрибути от страна на клиента може да се осъществи достъп до метаданни на UNIX, но това би увеличило значително натоварването на сървъра и ще повлияе на производителността в повечето случаи.

Пример 01:

Ето програма на C, която демонстрира извикване на функцията за четене в системата Linux. Напишете командата по-долу, както е в нов файл. Добавете библиотеки и в основната функция инициализирайте дескриптор и размер. Дескрипторът отваря файла и размерът се използва за четене на данните на файла.

Изходът за горния код ще бъде както е показано на изображението по-долу.

Пример 02:

Друг пример за илюстриране на работата на функцията за четене е даден по-долу.

Създайте друг файл и запишете кода по-долу, както е в него. Ето два дескриптора, fd1 и fd2, които и двата имат собствен достъп до файл с отворена таблица. Така че за foobar.txt, всеки дескриптор има своето местоположение на файла. Първият байт на foobar.txt се превежда от fd2 и резултатът е c = f, а не c = o.

Заключение

Прочетохме ефективно функцията за четене POSIX в програмирането на C. Дано не останат съмнения.

Vulkan за потребители на Linux
С всяко ново поколение графични карти виждаме, че разработчиците на игри преместват границите на графичната вярност и се приближават една крачка до фо...
OpenTTD срещу Simutrans
Създаването на собствена транспортна симулация може да бъде забавно, релаксиращо и изключително примамливо. Ето защо трябва да сте сигурни, че изпробв...
Урок за OpenTTD
OpenTTD е една от най-популярните бизнес симулационни игри там. В тази игра трябва да създадете прекрасен транспортен бизнес. Въпреки това, ще започне...