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

Posix Read Function C Programing



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

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

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







#включва

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



>>ssize_t pread(intслонова кост,невалиден *буф,size_tnbyte, off_t отместване);
>>ssize_t четене(intfd,невалиден *буф,size_tnбайта);

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



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





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

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



Описание

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

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

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

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

Възвращаема стойност

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

Грешки

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

EAGAIN:

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

EWOULDBLOCK:

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

EBADF:

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

По подразбиране:

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

EINTR:

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

ИЗБОР:

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

ИЗБОР:

Дескрипторът „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 ефективно. Дано не останат никакви съмнения.