Funkce čtení POSIX v programování C.

Posix Read Function C Programing



V tradičních operačních systémech kompatibilních s POSIX používal program k získání informací z dokumentu obsaženého v souborovém systému volání systémového čtení. Soubor definuje deskriptor dokumentu, ke kterému se obvykle přistupuje z předchozího volání k otevření. Toto systémové čtení systému přečte informace v bajtech a celé číslo, které volající z dokumentu určí, a poté je uloží do vyrovnávací paměti poskytnuté mechanismem volání.

Definice funkce

Před definováním funkce čtení v kódu musíte zahrnout některé požadované balíčky.







#zahrnout

Zde je návod, jak definujete funkci čtení POSIX:



>>ssize_t pread(intslonová kost,prázdné *bufet,velikost_tnbyte, off_t offset);
>>ssize_t přečteno(intfd,prázdné *bufet,velikost_tnbytů);

Z volání metody čtení lze převzít tři argumenty parametrů:



int fd: Popisovač souboru, ze kterého se mají informace číst. Buď můžeme použít deskriptor souboru získaný otevřeným systémovým voláním, nebo můžeme použít 0, 1 nebo 2 odkazující na typický vstup, pravidelný výstup nebo pravidelnou chybu.





Prázdno *buf: Vyrovnávací paměť nebo pole znaků, ve kterém by měla být uložená a uchovávána načtená data.

Size_t nbyte: Počet bajtů, které bylo nutné z dokumentu přečíst před zkrácením. Všechny informace lze uložit do vyrovnávací paměti, pokud jsou informace, které mají být čteny, kratší než nbytů.



Popis

Metoda read () se pokouší načíst bajty „nbyte“ do vyrovnávací paměti, na kterou odkazuje „buf“, buď ze souboru spojeného s otevřeným deskriptorem dokumentu „Fildes“ nebo „fd“. Nedefinuje povahu několika simultánních čtení na stejném proudu, FIFO nebo koncové jednotce.

U dokumentů, které umožňují čtení, proces čtení začíná odsazením dokumentu a posun se zvýší o počet přečtených bajtů. Pokud je posun dokumentu na okraji souboru nebo za jeho okrajem, nejsou přečteny žádné bajty a read () nezíská žádný.

Když je počet 0, read () rozpozná níže uvedené chyby. Pokud nedojde k žádným chybám nebo pokud read () není účtováno s chybami, read () poskytne nulu s počtem 0, a proto nemá žádné další důsledky.

Pokud je počet vyšší než SSIZE_MAX, podle POSIX.1, pak je výsledek určen implementací.

Návratová hodnota

Číslice bajtů „přečteno“ a „předem“ vrácené po dosažení výsledku musí být nezáporné celé číslo, zatímco nula ukazuje na konec souboru. Pozice dokumentu je posunuta o toto číslo, nebo jinak, aby znamenala chybu, metody vrátí -1 a přiřadí 'errno'. Pokud je toto číslo menší než požadovaný počet bajtů, nejedná se o chybový bajt. Je možné, že prozatím je k dispozici méně bajtů.

Chyby

Funkce pread and read bude neúspěšná, pokud dojde k těmto chybám:

ZNOVU:

Popisovač dokumentu nebo souboru „fd“ patří k souboru bez soketu, který byl označen jako neblokující (O NONBLOCK) a bude blokovat čtení.

EWOULDBLOCK:

Deskriptor „fd“ patří do soketu, který byl označen jako neblokující (O_NONBLOCK) a bude blokovat čtení.

EBADF:

Písmeno „fd“ nemusí být použitelný deskriptor nebo nemusí být otevřeno ke čtení.

VÝCHOZÍ:

K tomu dochází, když je váš „buf“ mimo váš dostupný adresní prostor.

EINTR:

Před načtením informačních dat se hovor mohl přerušit signálem.

VÝBĚR:

K této chybě dochází, když je váš deskriptor 'fd' zapojen do objektu, který není vhodný pro čtení, nebo byl dokument rozvázán s příznakem O_DIRECT a jednou nebo druhou adresou uvedenou v 'buf', hodnotou uvedenou v 'count ', nebo není ofset dokumentu vhodně přidružen.

VÝBĚR:

Deskriptor „fd“ mohl být vytvořen pomocí volání timerfd_create (2) a ke čtení byla dána vyrovnávací paměť nesprávné velikosti.

EIO:

Jedná se o chybu vstupu/výstupu. K tomu dochází, když se skupina procesů na pozadí pokusí číst ze svého regulačního terminálu a jeden nebo druhý přehlíží nebo blokuje SIGTTIN nebo je skupina procesů pozměněna. Dalším důvodem této chyby může být chyba vstupu/výstupu nízké úrovně při čtení z pevného disku nebo pásky. Další potenciální příčinou EIO u síťových datových souborů je odstranění poradního zamykání na deskriptoru souboru a selhání tohoto zámku.

EISDIR:

Popisovač souboru „fd“ patří do adresáře.

Poznámky:

Může se také objevit mnoho dalších chyb, závislých na objektu spojeném s deskriptorem „fd“. Formáty size_t i ssize_t jsou neoznačené a označené číselné datové typy definované POSIX.1. V systému Linux lze pomocí funkce čtení (a ekvivalentních systémových volání) přenášet nejvýše 0x7ffff000 (2 147 479 552) bytů, čímž se vrátí počet původně přenesených bytů (na 32bitové i 64bitové platformě). U souborových systémů NFS platí, že jen v prvním okamžiku, kdy se časové razítko změní čtením malých toků informací, další volání by to neudělaly. Je spuštěno ukládáním do mezipaměti atributů na straně klienta, protože, i když ne všichni, klienti NFS přestanou aktualizovat na server přes st_atime (čas posledního přístupu k souboru) a čtení na straně klienta splněná z vyrovnávací paměti klienta by nespustila změny na st- atime na serveru, protože nejsou k dispozici žádná měření na straně serveru. Odstraněním mezipaměti atributů na straně klienta lze přistupovat k metadatům systému UNIX, což by však ve většině případů výrazně zvýšilo zatížení serveru a ovlivnilo produktivitu.

Příklad 01:

Zde je program C, který demonstruje volání funkce čtení v systému Linux. Napište níže uvedený příkaz tak, jak je v novém souboru. Přidejte knihovny a v hlavní funkci inicializujte deskriptor a velikost. Deskriptor otevírá soubor a velikost se používá ke čtení dat souboru.

Výstup pro výše uvedený kód by byl stejný jako na obrázku níže.

Příklad 02:

Další příklad pro ilustraci fungování funkce čtení je uveden níže.

Vytvořte další soubor a zapište si níže uvedený kód, jak je v něm. Zde jsou dva deskriptory, fd1 a fd2, které oba mají svůj vlastní přístup k otevřenému souboru tabulky. Takže pro foobar.txt má každý deskriptor své umístění souboru. Úplně první byte foobar.txt je přeložen z fd2 a výsledkem je c = f, ne c = o.

Závěr

Účinně jsme přečetli funkci čtení POSIX v programování C. Naštěstí nezbyly žádné pochybnosti.