Basahin ang Pag-andar ng POSIX sa C Programing

Posix Read Function C Programing



Sa tradisyunal na POSIX katugmang mga operating system, upang makakuha ng impormasyon mula sa isang dokumento na nilalaman sa isang file system, ginamit ng isang programa ang read system call. Ang isang deskriptor ng dokumento na karaniwang na-access mula sa isang paunang tawag upang buksan ay tinukoy ng file. Ang read system call na ito ay binabasa ang impormasyon sa mga byte at ang integer kung saan tinukoy ng tumatawag mula sa dokumento, at pagkatapos ay nai-save ito sa isang buffer na ibinigay ng mekanismo ng pagtawag.

Kahulugan ng Pag-andar

Bago tukuyin ang read function sa iyong code, kailangan mong isama ang ilang kinakailangang mga pakete.







# isama

Narito kung paano mo tinukoy ang pagpapaandar na POSIX na binasa:



>>ssize_t pread(intgaring,walang bisa *tagabili,size_tnbyte, off_t offset);
>>nabasa na(inttaut,walang bisa *tagabili,size_tnbytes);

Tatlong mga argument na parameter ay maaaring makuha mula sa tawag na paraan ng pagbasa:



int tot: Ang tagapaglaraw ng file ng file mula sa kung saan babasahin ang impormasyon. Maaari kaming gumagamit ng isang tagapaglarawan ng file na nakuha sa pamamagitan ng isang bukas na tawag sa system, o maaari lamang kaming gumamit ng 0, 1, o 2 na tumutukoy sa karaniwang input, regular na output, o regular na error, ayon sa pagkakabanggit.





Walang bisa * buf: Ang buffer o character array kung saan dapat mabasa at maiimbak ang nabasang data.

Size_t nbyte: Ang bilang ng mga byte na kailangang basahin mula sa dokumento bago i-trim. Ang lahat ng impormasyon ay maaaring maiimbak sa buffer kung ang impormasyong mababasa ay mas maikli kaysa sa nbytes.



Paglalarawan

Sinisikap ng pamamaraang nabasa () na basahin ang mga byte ng 'nbyte' sa buffer cache na tinukoy ng 'buf' mula sa alinmang file na konektado sa bukas na deskriptor na 'Fildes' o 'fd'. Hindi nito tinukoy ang likas na katangian ng maraming mga sabay na pagbasa sa parehong stream, FIFO, o terminal unit.

Sa mga dokumento na nagbibigay-daan sa pagbabasa, ang proseso ng pagbabasa ay nagsisimula sa offset ng dokumento, at ang offset ay nadagdagan ng bilang ng mga byte na nabasa. Kung ang offset ng dokumento ay nasa o lampas sa gilid ng file, walang nabasa na mga byte, at basahin ang () walang magbubunga.

Kapag ang bilang ay 0, basahin ang () makikilala ang mga error na nabanggit sa ibaba. Kung walang mga pagkakamali, o kung ang nabasa () ay hindi isinasaalang-alang sa Mga Error, ang isang nabasa () ay magbubunga ng zero na may bilang na 0 at samakatuwid ay walang ibang mga epekto.

Kung ang bilang ay mas mataas kaysa sa SSIZE_MAX, ayon sa bawat POSIX.1, kung gayon ang kinalabasan ay natutukoy ng pagpapatupad.

Halaga ng Pagbabalik

Ang bilang ng mga byte na 'nabasa' at 'pread' na ibinalik sa nakamit ay dapat na isang hindi negatibong integer habang zero puntos sa dulo ng file. Ang posisyon ng dokumento ay isinulong ng bilang na ito, o kung hindi man, upang mag-signign ng isang error, ang mga pamamaraan ay bumalik -1 at magtalaga ng 'errno'. Kapag ang figure na ito ay mas mababa sa bilang ng mga hiniling na byte, hindi ito isang byte ng pagkakamali. Maaaring posible na mas kaunting mga byte ang magagamit sa ngayon.

Mga Error

Ang pread at read function ay hindi matagumpay kung maganap ang mga error na ito:

EAGAIN:

Ang dokumento o tagapaglaraw ng file na 'taut' ay kabilang sa isang hindi-socket na file na may label na hindi nagba-block (O NONBLOCK) at hahadlangan ang pagbabasa.

EWOULDBLOCK:

Ang tagapaglaraw na 'taut' ay kabilang sa isang socket na may label na hindi nagba-block (O_NONBLOCK) at harangan ang pagbabasa.

EBADF:

Ang 'taut' ay maaaring hindi isang magagamit na tagapaglarawan, o maaaring hindi ito bukas para sa pagbabasa.

EFAULT:

Nangyayari ito kapag ang iyong 'buf' ay nasa labas ng iyong maaabot na espasyo sa address.

EINTR:

Bago ang pagbabasa ng data ng impormasyon, ang tawag ay maaaring nasira ng isang senyas.

PUMILI:

Nangyayari ang error na ito kapag ang iyong tagapaglaraw na 'taut' ay kasangkot sa isang bagay, na hindi angkop para sa pagbabasa, o ang dokumento ay naalis sa bandila ng O_DIRECT flag, at isa o iba pang address na nakasaad sa 'buf', ang halagang ipinahiwatig sa 'count ', o ang offset ng dokumento ay hindi naaangkop na naiugnay.

PUMILI:

Ang tagapaglaraw na 'taut' ay maaaring nabuo gamit ang isang tawag sa timerfd_create (2), at ang maling laki ng buffer ay ibinigay upang mabasa.

EIO:

Ito ay isang error sa pag-input / output. Ito ay nangyayari kapag ang pangkat ng proseso ng background ay nagtatangkang basahin mula sa terminal ng regulasyon nito, at ang isa o isa pa ay tinatanaw o hinaharangan ang SIGTTIN, o ang pangkat ng proseso nito ay naiwan. Ang isa pang dahilan para sa error na ito ay maaaring maging mababang antas ng pag-input / output error habang ang pagbabasa mula sa isang hard disk o tape. Ang isa pang potensyal na sanhi ng EIO sa naka-network na mga file ng data ay ang pagtanggal ng lock ng advisory sa tagapaglaraw ng file at pagkabigo ng lock na iyon.

EISDIR:

Ang tagapaglaraw ng file na 'taut' ay kabilang sa isang direktoryo.

Mga Tala:

Marami pang ibang mga error ang maaari ring mangyari, nakasalalay sa object na naka-link sa deskriptor na 'taut'. Ang parehong mga form ng size_t at ssize_t ay hindi minarkahan at minarkahan ng mga uri ng data na bilang na tinukoy ng POSIX.1. Sa Linux, higit sa 0x7ffff000 (2,147,479,552) mga byte ay maaaring maipadala sa pamamagitan ng pag-andar ng pagbabasa (at katumbas na mga tawag sa system), ibabalik ang bilang ng mga byte na orihinal na naihatid (sa parehong 32-bit at 64-bit na mga platform). Sa mga NFS filesystem, sa unang sandali lamang ay nabago ang timestamp sa pamamagitan ng pagbabasa ng maliliit na daloy ng impormasyon, hindi ito gagawin ng mga kasunod na tawag. Ito ay pinalitaw ng pag-cache ng mga katangiang panig ng kliyente dahil, kahit na hindi lahat, ang mga kliyente ng NFS ay tumigil sa pag-update sa server sa pamamagitan ng st_atime (huling oras ng pag-access ng file) at ang pagbasa sa panig ng kliyente na natupad mula sa buffer ng kliyente ay hindi magpapalitaw ng mga pagbabago sa st- atime sa server dahil walang magagamit na mga pagbabasa sa panig ng server. Sa pamamagitan ng pag-aalis ng cache ng pagpapatungkol sa client, maaaring ma-access ang UNIX metadata, ngunit malaki ang maitataas nitong pagkarga sa server at nakakaapekto sa pagiging produktibo sa karamihan ng mga kaso.

Halimbawa 01:

Narito ang isang C program upang ipakita ang read function na tawag sa Linux System. Isulat ang utos sa ibaba dahil nasa isang bagong file. Magdagdag ng mga aklatan, at sa pangunahing pagpapaandar, ipasimula ang isang tagapaglarawan at laki. Ang deskriptor ay binubuksan ang file, at ginagamit ang laki upang mabasa ang data ng file.

Ang output para sa nasa itaas na code ay ipapakita sa larawan sa ibaba.

Halimbawa 02:

Ang isa pang halimbawa upang ilarawan ang pagtatrabaho ng read function ay ibinigay sa ibaba.

Lumikha ng isa pang file at isulat ang code sa ibaba dahil narito ito. Narito ang dalawang tagapaglarawan, ang tautang & taut, na parehong may kani-kanilang bukas na pag-access sa file na talahanayan. Kaya para sa foobar.txt, ang bawat deskriptor ay mayroong lokasyon ng file. Ang pinakaunang byte ng foobar.txt ay isinalin mula sa tsar2, at ang resulta ay c = f, hindi c = o.

Konklusyon

Nabasa namin ang pagpapaandar ng POSIX na nabasa sa C na programa nang mahusay. Sana, walang mga natitirang pagdududa.