C Programmēšana

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

POSIX lasīšanas funkcija C programmēšanā
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ītās sistēmas izsaukumu. Dokumenta deskriptoru, kuram parasti piekļūst no iepriekšēja aicinājuma atvērt, nosaka fails. Šis nolasītais sistēmas izsaukums nolasa informāciju baitos un veselu skaitli, kuru zvanītājs norāda no dokumenta, un pēc tam to saglabā buferī, ko nodrošina izsaukšanas mehānisms.

Funkcijas definīcija

Pirms kodā definējat lasīšanas funkciju, jums jāiekļauj daži nepieciešamie pakotnes.

# iekļaut

Lū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.

Atdariniet peles klikšķus, virzot kursoru, izmantojot operētājsistēmā Windows 10 bezklikšķu peli
Peles vai tastatūras lietošana nepareizā pozā, ja to lieto pārmērīgi daudz, var izraisīt daudz veselības problēmu, tostarp spriedzi, karpālā kanāla si...
Pievienojiet peles žestus operētājsistēmai Windows 10, izmantojot šos bezmaksas rīkus
Pēdējos gados datori un operētājsistēmas ir ievērojami attīstījušās. Bija laiks, kad lietotājiem bija jāizmanto komandas, lai pārvietotos pa failu pār...
Kontrolējiet un pārvaldiet peles kustību starp vairākiem monitoriem sistēmā Windows 10
Dual Display Mouse Manager ļauj kontrolēt un konfigurēt peles kustību starp vairākiem monitoriem, palēninot tās kustību robežas tuvumā. Windows 10/8 ļ...