ПОСИКС функција читања у Ц програмирању

Posix Read Function C Programing



У традиционалним ПОСИКС компатибилним оперативним системима, програм је користио системски позив за читање да би добио информације из документа који се налази у систему датотека. Дескриптор документа којем се обично приступа из претходног позива за отварање је дефинисан датотеком. Овај системски позив за читање чита информације у бајтовима и цео број који позивалац наводи из документа, а затим их чува у баферу који обезбеђује механизам за позивање.

Дефиниција функције

Пре него што дефинишете функцију читања у свом коду, морате укључити неке потребне пакете.







#инцлуде

Ево како дефинишете ПОСИКС функцију читања:



>>ссизе_т преад(интслоновача,празнина *буф,сизе_тнбите, офф_т оффсет);
>>ссизе_т реад(интфд,празнина *буф,сизе_тнбајта);

Три позива параметра могу се узети из позива методе читања:



инт фд: Дескриптор датотеке из које се читају информације. Могли бисмо или да користимо дескриптор датотеке добијен отвореним системским позивом, или бисмо могли да користимо само 0, 1 или 2 који се односе на типичан улаз, редовни излаз или редовну грешку.





Воид *буф: Међуспремник или низ знакова у које треба прочитане податке сачувати и чувати.

Сизе_т нбите: Број бајтова које је требало прочитати из документа пре скраћивања. Све информације се могу похранити у бафер ако су информације које се читају краће од нбајта.



Опис

Метод реад () покушава да прочита „нбите“ бајтове у међумеморију на коју се позива „буф“ из било које датотеке повезане са дескриптором отвореног документа „Филдес“ или „фд“. Не дефинише природу неколико истовремених очитавања на истом току, ФИФО -у или терминалној јединици.

На документима који омогућавају читање, процес читања почиње са помаком документа, а помак се повећава за број прочитаних бајтова. Ако је помак документа на ивици датотеке или изван ње, нема прочитаних бајтова, а реад () не даје ништа.

Када је одбројавање 0, реад () ће препознати доле наведене грешке. Ако нема грешака или ако реад () није урачунат у Еррорс, реад () даје нулу са бројем 0 и стога нема других последица.

Ако је број већи од ССИЗЕ_МАКС, према ПОСИКС.1, онда је исход одређен имплементацијом.

Повратна вредност

Број бајтова „читање“ и „преад“ враћен након постизања мора бити цели број који није негативан, док нула показује на крај датотеке. Положај документа напредује овим бројем, иначе, да означи грешку, методе враћају -1 и додељују „еррно“. Када је ова цифра мања од броја захтеваних бајтова, то није грешка. Могуће је да је за сада доступно мање бајтова.

Грешке

Функција преад и реад неће бити успешна ако дође до ових грешака:

ЕАГАИН:

Дескриптор документа или датотеке „фд“ припада датотеци која није утичница и која је означена као неблокирајућа (О НБЛОКИРАЈ) и блокира читање.

ЕВОУЛДБЛОЦК:

Дескриптор „фд“ припада утичници која је означена као неблокирајућа (О_НОНБЛОЦК) и блокира читање.

ЕБАДФ:

„Фд“ можда није употребљив опис или можда није отворен за читање.

ЗНАЧАЈНО:

То се дешава када се ваш „буф“ налази изван вашег приступачног адресног простора.

ЕИНТР:

Пре читања информационих података, позив је можда прекинуо сигнал.

ИЗБОР:

Ова грешка се јавља када је ваш 'фд' дескриптор укључен у објекат који није прикладан за читање, или је документ одвезан ознаком О_ДИРЕЦТ, а једна или друга адреса наведена у 'буф', вредност наведена у 'цоунт ', или офсет документа није на одговарајући начин повезан.

ИЗБОР:

Дескриптор „фд“ је можда формиран позивом на тимерфд_цреате (2), а бафер неисправне величине је дат за читање.

ЕИО:

Грешка је у улазу/излазу. То се догађа када позадинска група процеса покушава читати са свог регулаторног терминала, а једно или друго превиђа или блокира СИГТТИН, или је његова група процеса ожалошћена. Други разлог за ову грешку могла би бити грешка улаза/излаза ниског нивоа у међувремену читање са тврдог диска или траке. Још један потенцијални узрок ЕИО -а на умреженим датотекама података је уклањање саветодавног закључавања дескриптора датотеке и неуспех тог закључавања.

ЕИСДИР:

Дескриптор датотеке „фд“ припада директоријуму.

Напомене:

Могу се појавити и многе друге грешке, зависно од објекта повезаног са дескриптором „фд“. Облици сизе_т и ссизе_т су неозначени и означени нумерички типови података дефинисани ПОСИКС.1. На Линук-у се највише 0к7фффф000 (2,147,479,552) бајтова може пренети функцијом читања (и еквивалентним системским позивима), враћајући број првобитно пренесених бајтова (и на 32-битној и на 64-битној платформи). Са НФС датотечним системима, само у првом тренутку када се временска ознака промени читањем сићушних токова информација, накнадни позиви то не би учинили. Покреће се кеширањем атрибута на страни клијента јер, мада не сви, НФС клијенти су прекинули ажурирање на сервер преко ст_атиме (последње време приступа датотеци) и читања на страни клијента испуњена из бафера клијента не би покренула промене ст- атиме на серверу јер очитавања на страни сервера нису доступна. Уклањањем кеширања атрибута на страни клијента, може се приступити УНИКС метаподацима, али би то значајно повећало оптерећење сервера и утицало на продуктивност у већини случајева.

Пример 01:

Ево Ц програма за демонстрирање позива функције читања на Линук систему. Напишите наредбу испод како се налази у новој датотеци. Додајте библиотеке и у главној функцији иницијализујте дескриптор и величину. Дескриптор отвара датотеку, а величина се користи за читање података датотеке.

Излаз за горњи код би био као што је приказано на доњој слици.

Пример 02:

Још један пример за илустрацију рада функције читања дат је испод.

Направите другу датотеку и запишите доњи код онакав какав је у њему. Ево два дескриптора, фд1 и фд2, који имају свој приступ датотекама отворене табеле. Дакле, за фообар.ткт, сваки дескриптор има своју локацију датотеке. Први бајт фообар.ткт преведен је из фд2, а резултат је ц = ф, а не ц = о.

Закључак

Ефикасно смо прочитали ПОСИКС функцију читања у Ц програмирању. Надајмо се да нема више сумње.