POSIX lasīšanas funkcija programmēšanā C

Posix Read Function C Programing



Tradicionālajās ar POSIX saderīgajās operētājsistēmās, lai iegūtu informāciju no failu sistēmā esoša dokumenta, programma izmantoja lasīšanas sistēmas zvanu. Dokumenta aprakstu, kuram parasti piekļūst no iepriekšēja zvana, lai to atvērtu, nosaka fails. Šis lasīšanas sistēmas izsaukums nolasa informāciju baitos un veselu skaitli, kuru zvanītājs norāda no dokumenta, un pēc tam saglabā to izsaukšanas mehānisma nodrošinātajā buferī.

Funkcijas definīcija

Pirms lasīšanas funkcijas definēšanas kodā ir jāiekļauj dažas nepieciešamās paketes.







#iekļaut

Lūk, kā jūs definējat POSIX lasīšanas funkciju:



>>ssize_t pread(intziloņkauls,spēkā neesošs *buf,size_tnbaits, off_t nobīde);
>>ssize_t lasīt(intfd,spēkā neesošs *buf,size_tnbaiti);

No lasīšanas metodes izsaukuma var ņemt trīs parametru argumentus:



int fd: Tā faila deskriptors, no kura jālasa informācija. Mēs varētu vai nu izmantot faila aprakstu, kas iegūts, izmantojot atvērtas sistēmas zvanu, vai arī vienkārši izmantot 0, 1 vai 2, kas attiecas uz tipisku ievadi, regulāru izvadi vai regulāru kļūdu.





Anulēts *buf: Buferis vai rakstzīmju masīvs, kurā jāsaglabā un jāglabā nolasītie dati.

Izmērs_t nbaits: Baitu skaits, kas pirms saīsināšanas bija jāizlasa no dokumenta. Visu informāciju var saglabāt buferī, ja lasāmā informācija ir īsāka par nbaitiem.



Apraksts

Metode read () mēģina bufera kešatmiņā nolasīt “nbyte” baitus, uz ko atsaucas “buf”, vai nu no faila, kas saistīts ar atvērtā dokumenta deskriptoru “Fildes” vai “fd”. Tas nenosaka vairāku vienlaicīgu lasījumu raksturu vienā straumē, FIFO vai termināļa blokā.

Dokumentos, kas nodrošina lasīšanu, lasīšanas process sākas no dokumenta nobīdes, un nobīde tiek palielināta par izlasīto baitu skaitu. Ja dokumenta nobīde atrodas faila malā vai ārpus tās, netiek lasīti baiti, un lasīšanas () rezultāts nav.

Kad skaits ir 0, lasot () tiks atpazītas tālāk minētās kļūdas. Ja nav kļūdu vai ja lasījums () netiek ņemts vērā ar kļūdām, lasījums () dod nulli ar skaitli 0, un tāpēc tam nav citu seku.

Ja skaits ir lielāks par SSIZE_MAX saskaņā ar POSIX.1, tad rezultātu nosaka ieviešana.

Atgriezt vērtību

Sasniegtajam atgrieztajam baitu “nolasīt” un “iepriekš sagatavotais” skaitlim ir jābūt veselam skaitlim, kas nav negatīvs, bet nulle norāda uz faila beigām. Dokumenta pozīcija tiek palielināta par šo numuru, vai arī, lai apzīmētu kļūdu, metodes atgriež -1 un piešķir “errno”. Ja šis skaitlis ir mazāks par pieprasīto baitu skaitu, tas nav baitu kļūda. Iespējams, ka pagaidām ir pieejams mazāk baitu.

Kļūdas

Iepriekš sagatavotā un lasīšanas funkcija būs neveiksmīga, ja rodas šādas kļūdas:

EAGAIN:

Dokuments vai faila apraksts “fd” pieder failam bez ligzdas, kas atzīmēts kā nebloķējošs (O NONBLOCK), un tas bloķēs lasīšanu.

EWOULDBLOCK:

Apraksts “fd” pieder ligzdai, kas atzīmēta kā nebloķējoša (O_NONBLOCK) un bloķēs nolasījumu.

EBADF:

Fd var nebūt izmantojams apraksts vai arī tas nav atvērts lasīšanai.

EFAULT:

Tas notiek, ja jūsu buf atrodas ārpus jūsu sasniedzamās adreses telpas.

EINTR:

Pirms informācijas datu nolasīšanas zvans var tikt pārtraukts ar signālu.

IZVĒLE:

Šī kļūda rodas, ja jūsu fd deskriptors ir iesaistīts lasīšanai nepiemērotā objektā vai dokuments tika atsaistīts ar karodziņu O_DIRECT un viena vai otra adrese, kas norādīta buf, vērtība, kas norādīta skaitļos ', vai dokumenta nobīde nav atbilstoši saistīta.

IZVĒLE:

Apraksts “fd”, iespējams, tika izveidots, izmantojot zvanu uz timerfd_create (2), un lasīšanai tika dots nepareiza izmēra buferis.

EIO:

Tā ir ievades/izvades kļūda. Tas notiek, kad fona procesa grupa mēģina lasīt no sava regulējošā termināļa, un viens vai otrs nepamanīs vai bloķēs SIGTTIN, vai arī tā procesa grupa būs zaudējusi. Vēl viens šīs kļūdas iemesls varētu būt zema līmeņa ievades/izvades kļūda, lasot no cietā diska vai lentes. Vēl viens potenciāls EIR cēlonis tīkla datu failos ir konsultatīvās bloķēšanas noņemšana faila aprakstā un šīs bloķēšanas kļūme.

EISDIR:

Faila deskriptors “fd” pieder direktorijam.

Piezīmes:

Var rasties arī daudzas citas kļūdas atkarībā no objekta, kas saistīts ar deskriptoru “fd”. Gan formāts size_t, gan ssize_t ir neatzīmēti un atzīmēti ciparu datu tipi, kas definēti ar POSIX.1. Operētājsistēmā Linux ne vairāk kā 0x7ffff000 (2 147 479 552) baitus var pārraidīt, lasot funkciju (un līdzvērtīgus sistēmas zvanus), atgriežot sākotnēji pārraidīto baitu skaitu (gan 32 bitu, gan 64 bitu platformās). Izmantojot NFS failu sistēmas, tikai pirmais brīdis, kad tiek mainīts laika zīmogs, lasot sīkas informācijas plūsmas, turpmākie zvani to nedarītu. To izraisa klienta puses atribūtu kešatmiņa, jo, lai gan ne visi, NFS klienti pārtrauc atjaunināšanu serverī, izmantojot st_atime (pēdējā faila piekļuves laiks), un klienta puses lasījumi, kas izpildīti no klienta bufera, neizraisītu izmaiņas laikā serverī, jo nav pieejami servera puses rādījumi. Noņemot klienta puses atribūtu kešatmiņu, var piekļūt UNIX metadatiem, taču tas ievērojami palielinātu servera noslodzi un vairumā gadījumu ietekmētu produktivitāti.

Piemērs 01:

Šeit ir C programma, lai demonstrētu lasīšanas funkcijas izsaukumu Linux sistēmā. Ierakstiet zemāk esošo komandu jaunā failā. Pievienojiet bibliotēkas un galvenajā funkcijā inicializējiet deskriptoru un lielumu. Apraksts atver failu, un faila datu nolasīšanai tiek izmantots lielums.

Iepriekš minētā koda izvade būtu tāda, kā parādīts zemāk esošajā attēlā.

02 piemērs:

Tālāk ir sniegts vēl viens piemērs, lai ilustrētu lasīšanas funkcijas darbību.

Izveidojiet citu failu un pierakstiet zemāk redzamo kodu. Šeit ir divi deskriptori, fd1 un fd2, kuriem abiem ir sava piekļuve atvērtā galda failiem. Tātad faila foobar.txt katram aprakstam ir sava faila atrašanās vieta. Pats pirmais foobar.txt baits tiek tulkots no fd2, un rezultāts ir c = f, nevis c = o.

Secinājums

Mēs esam efektīvi nolasījuši POSIX lasīšanas funkciju C programmēšanā. Cerams, ka šaubu vairs nav.