Funkcijas definīcija
Pirms kodā definējat lasīšanas funkciju, jums jāiekļauj daži nepieciešamie pakotnes.
# iekļautLūk, kā jūs definējat POSIX lasīšanas funkciju:
>> ssize_t pread (int fildes, void * buf, size_t nbyte, off_t offset);>> ssize_t lasīt (int fd, void * buf, size_t nbytes);
No lasīšanas metodes izsaukuma var ņemt trīs parametru argumentus:
int fd: Faila deskriptors failam, no kura informācija jālasa. Mēs varētu vai nu izmantot faila deskriptoru, kas iegūts, izmantojot atvērtu sistēmas izsaukumu, vai arī mēs varētu vienkārši izmantot 0, 1 vai 2, attiecinot attiecīgi uz tipisku ievadi, parasto izvadi vai regulāru kļūdu.
Void * buf: Buferis vai rakstzīmju masīvs, kurā jāsaglabā un jāglabā nolasītie dati.
Size_t nbyte: 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 mazāka par nbaitu.
Apraksts
Metode read () mēģina nolasīt “nbyte” baitus bufera kešatmiņā, uz kuru norāda “buf”, no faila, kas saistīts ar atvērtā dokumenta deskriptoru “Fildes” vai “fd”. Tas nenosaka vairāku vienlaikus lasījumu raksturu vienā straumē, FIFO vai termināla blokā.
Dokumentos, kas nodrošina lasīšanu, lasīšanas process sākas ar dokumenta nobīdi, un nobīdi palielina par nolasīto baitu skaitu. Ja dokumenta nobīde atrodas faila malā vai aiz tās, lasīto baitu nav, un read () nedod nevienu.
Kad skaitlis ir 0, read () atpazīs tālāk minētās kļūdas. Ja kļūdu nav vai lasīšana () netiek ņemta 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 nekā SSIZE_MAX, kā norādīts POSIX.1, tad rezultātu nosaka ieviešana.
Atgriešanās vērtība
Pēc sasniegšanas atgriezto baitu skaitam “lasīt” un “pread” jābūt veselam skaitlim, kas nav negatīvs, bet nulles punkts faila beigās. Dokumenta pozīcija tiek virzīta uz priekšu ar šo skaitli, 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 kļūdas baits. Iespējams, ka šobrīd ir pieejams mazāk baitu.
Kļūdas
Pread and read funkcija būs neveiksmīga, ja rodas šīs kļūdas:
EAGAIN:
Dokuments vai faila deskriptors “fd” pieder failam, kas nav ligzda un kas ir apzīmēts kā nebloķējošs (O NONBLOCK) un bloķēs lasīšanu.
EWOULDBLOCK:
Apraksts “fd” pieder ligzdai, kas ir apzīmēta kā nebloķējoša (O_NONBLOCK) un bloķēs lasīšanu.
EBADF:
“Fd” var nebūt izmantojams deskriptors vai arī tas nav atvērts lasīšanai.
EFAULT:
Tas notiek, kad jūsu “buf” atrodas ārpus jūsu sasniedzamās adreses vietas.
EINTR:
Pirms informācijas datu nolasīšanas zvans var būt sadalījies pēc signāla.
EINVAL:
Šī kļūda rodas, ja jūsu “fd” deskriptors ir iesaistīts objektā, kas nav piemērots lasīšanai, vai arī dokuments tika atvienots ar karogu O_DIRECT un viena vai otra adrese, kas norādīta “buf”, vērtība, kas norādīta “count” ", vai arī dokumenta nobīde nav atbilstoši saistīta.
EINVAL:
Apraksts “fd”, iespējams, ir izveidots, izmantojot zvanu uz timerfd_create (2), un lasīšanai ir dots nepareiza lieluma buferis.
EIO:
Tā ir ievades / izvades kļūda. Tas notiek, kad fona procesa grupa mēģina nolasīt no sava regulatīvā termināla, un viens vai otrs ignorē vai bloķē SIGTTIN, vai arī tā procesa grupa ir zaudēta. 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 EIO cēlonis tīkla datu failos ir faila deskriptora konsultatīvās bloķēšanas noņemšana un šīs bloķēšanas kļūme.
EISDIR:
Failu deskriptors 'fd' pieder direktorijai.
Piezīmes:
Var rasties arī daudzas citas kļūdas, kas atkarīgas no objekta, kas saistīts ar deskriptoru “fd”. Gan formātā size_t, gan ssize_t nav atzīmēti un atzīmēti skaitliskie datu tipi, ko definējusi POSIX.1. Operētājsistēmā Linux var pārsūtīt ne vairāk kā 0x7ffff000 (2 147 479 552) baitus, lasot funkciju (un līdzvērtīgus sistēmas izsaukumus), atgriežot sākotnēji pārsūtīto baitu skaitu (gan 32, gan 64 bitu platformās). Izmantojot NFS failu sistēmas, tikai pirmajā brīdī laika zīmogs tiek mainīts, lasot sīkas informācijas plūsmas, nākamie zvani to nedarīs. To izraisa klienta atribūtu kešatmiņa, jo, kaut arī ne visi, NFS klienti pārtrauca atjaunināšanu serverī, izmantojot st_atime (pēdējais faila piekļuves laiks), un klienta puses lasījumi, kas izpildīti no klienta bufera, neizraisīs izmaiņas st 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 slodzi un vairumā gadījumu ietekmētu produktivitāti.
01. piemērs:
Šeit ir C programma, lai parādītu lasīšanas funkcijas izsaukumu Linux sistēmā. Uzrakstiet komandu zemāk, kā tas ir jaunā failā. Pievienojiet bibliotēkas un galvenajā funkcijā inicializējiet deskriptoru un lielumu. Apraksts atver failu, un faila datu nolasīšanai tiek izmantots izmērs.
Iepriekš minētā koda izvade būtu tāda, kā parādīts zemāk esošajā attēlā.
02. piemērs:
Vēl viens piemērs, kas ilustrē lasīšanas funkcijas darbību, ir sniegts zemāk.
Izveidojiet citu failu un pierakstiet kodu zemāk, kā tas tajā atrodas. Šeit ir divi deskriptori fd1 un fd2, kuriem abiem ir sava piekļuve atvērtas tabulas failiem. Tātad par foobar.txt, katram deskriptoram ir sava faila atrašanās vieta. Pats pirmais foobar baits.txt tiek tulkots no fd2, un rezultāts ir c = f, nevis c = o.
Secinājums
Mēs esam efektīvi izlasījuši POSIX lasīšanas funkciju C programmēšanā. Cerams, ka šaubu vairs nav.