Naučte sa otvoriť Linux Command

synopse

#include << A HREF = "súbor: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "súbor: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "súbor: /usr/include/fcntl.h"> fcntl.h> int otvorené (const char * pathname , int flags ); int open (konšt. char * pathname , int flags , mode_t mode ); int creat (const char * pathname, mode_t );

popis

Príkaz open () systémového volania linux sa používa na konverziu názvu cesty na deskriptor súborov (malé, negatívne celé číslo pre použitie v nasledujúcich vstupno-výstupných operáciách ako pri čítaní , písaní atď.). Keď je hovor úspešný, popisovač súboru sa vráti bude najnižším deskriptorom súborov, ktorý práve nie je otvorený pre daný proces. Toto volanie vytvorí nový otvorený súbor, ktorý nie je zdieľaný s iným procesom. (Ale zdieľané otvorené súbory môžu vzniknúť prostredníctvom systémového volania vidlice (2).) Nový deskriptor súborov je nastavený tak, aby zostal otvorený pre všetky funkcie exec (pozri fcntl (2)). Posun súboru je nastavený na začiatok súboru.

Parametre príznakov sú jedným z O_RDONLY , O_WRONLY alebo O_RDWR, ktoré požadujú otvorenie súboru iba na čítanie, iba písanie alebo čítanie / zápis, respektíve bitové- alebo "d s nulou alebo viacerými z nasledujúcich:

O_CREAT

Ak súbor neexistuje, vytvorí sa. Vlastník (ID používateľa) súboru je nastavený na efektívne ID používateľa procesu. Vlastníctvo skupiny (ID skupiny) je nastavené buď na skutočnú ID skupiny v procese alebo na ID skupiny nadradeného adresára (v závislosti od typu súborového systému a možností pripojenia a režimu nadradeného adresára, pozri napr. Pripojenie možnosti bsdgroups a sysvgroups súborového systému ext2, ako je popísané v mount (8)).

O_EXCL

Pri použití s O_CREAT , ak súbor už existuje, je to chyba a otvorená zlyhá. V tomto kontexte existuje symbolické prepojenie bez ohľadu na to, kam smeruje. O_EXCL je poškodený na súborových systémoch NFS , programy, ktoré sa na neho spoliehajú pri vykonávaní blokovacích úloh, budú obsahovať podmienku pretekov. Riešením na vykonávanie blokovania súborových súborov pomocou uzamknutého súboru je vytvorenie jedinečného súboru na rovnakom fs (napr. Obsahujúceho názov hostiteľa a pid), použite odkaz (2) na vytvorenie odkazu na uzamknutie súboru. Ak odkaz () vráti 0, zámok je úspešný. V opačnom prípade použite stat (2) na jedinečnom súbore, aby ste skontrolovali, či sa jeho počet odkazov zvýšil na 2, v takom prípade je zámok úspešný.

O_NOCTTY

Ak názov cesty odkazuje na koncové zariadenie --- pozri tty (4) --- nebude to riadiacim terminálom procesu, aj keď proces nemá jeden.

O_TRUNC

Ak súbor už existuje a je bežným súborom a otvorený režim umožňuje zápis (tj O_RDWR alebo O_WRONLY), bude skrátený na dĺžku 0. Ak je súbor FIFO alebo súbor terminálového zariadenia, príznak O_TRUNC sa ignoruje. V opačnom prípade je účinok O_TRUNC nešpecifikovaný. (V mnohých verziách systému Linux to bude ignorované, v iných verziách sa vráti chyba.)

O_APPEND

Súbor sa otvorí v režime pripojenia. Pred každým zápisom je ukazovateľ súboru umiestnený na konci súboru, akoby s lseek . O_APPEND môže viesť k poškodeniu súborov v súborových systémoch NFS, ak viac ako jeden proces pripojí dáta do súboru naraz. Dôvodom je to, že NFS nepodporuje pripojenie k súboru, takže jadro klienta musí simulovať, čo sa nedá vykonať bez podmienky pretekov.

O_NONBLOCK alebo O_NDELAY

Ak je to možné, súbor sa otvorí v režime bez blokovania. Ani otvorené ani žiadne následné operácie s popisom súboru, ktorý je vrátený, spôsobia, že proces volania čaká. Na manipuláciu s FIFO (nazývané potrubia), pozri aj fifo (4). Tento režim nemusí mať žiadny vplyv na iné súbory ako FIFO.

O_SYNC

Súbor je otvorený pre synchronné I / O. Akékoľvek zápisy na výsledný deskriptor súborov zablokujú proces volania, kým sa údaje fyzicky nezapíšu do základného hardvéru. Pozrite si však tieto obmedzenia:

O_NOFOLLOW

Ak je názov cesty symbolickým odkazom, otvorené zlyhá. Toto je rozšírenie FreeBSD, ktoré bolo pridané do Linuxu vo verzii 2.1.126. Symbolické odkazy v predchádzajúcich zložkách cesty budú stále dodržiavané. Hlavičky z glibc 2.0.100 a neskôr obsahujú definíciu tejto vlajky; jadra pred 2.1.126 bude ignorovať, ak sa použije .

O_DIRECTORY

Ak názov cesty nie je adresár, spôsobí to zlyhanie. Tento príznak je špecifický pre systém Linux a bol pridaný do jadra verzie 2.1.126, aby sa predišlo problémom s odmietnutím služby, ak sa opendir (3) zavolá na FIFO alebo páskové zariadenie, ale nemal by byť použitý mimo implementácie opendir ,

O_DIRECT

Pokúste sa minimalizovať efekty vyrovnávacej pamäte vstupu a výstupu z tohto súboru. Vo všeobecnosti to zhorší výkonnosť, ale je užitočné v špeciálnych situáciách, napríklad keď aplikácie robia vlastné ukladanie do vyrovnávacej pamäte. Súbor I / O sa vykonáva priamo do vyrovnávacej pamäte používateľského priestoru. I / O je synchrónny, tj po dokončení čítania (2) alebo zápisu (2) systémové volanie, dáta je zaručená, že boli prevedené. Veľkosti prenosu a vyrovnanie vyrovnávacej pamäte používateľa a posunu súboru musia byť násobky veľkosti logického bloku súborového systému.
Tento príznak je podporovaný mnohými systémami typu Unix; podpora bola pridaná pod Linuxom v jadre verzie 2.4.10.
Sémanticky podobné rozhranie pre blokové zariadenia je popísané v surovine (8).

O_ASYNC

Generujte signál (štandardne SIGIO, ale toto môže byť zmenené pomocou fcntl (2)), keď je vstup alebo výstup možný na tomto deskriptore. Táto funkcia je dostupná iba pre terminály, pseudonávody a zásuvky. Ďalšie informácie nájdete v časti fcntl (2).

O_LARGEFILE

Pri 32-bitových systémoch, ktoré podporujú systém veľkých súborov, povolte otvorenie súborov, ktorých veľkosti nemožno znázorniť v 31 bitoch.

Niektoré z týchto voliteľných príznakov sa môžu zmeniť po použití súboru fcntl po otvorení súboru.

Režim argumentov špecifikuje povolenia na použitie v prípade vytvorenia nového súboru. Je modifikovaný procesom umask obvyklým spôsobom: oprávnenia vytvoreného súboru sú (režim & ~ umask) . Upozorňujeme, že tento režim sa vzťahuje iba na budúce prístupy novovytvoreného súboru; otvorený hovor, ktorý vytvorí súbor iba na čítanie, môže vrátiť popisovač súboru na čítanie a zápis.

Pre režim sú uvedené nasledujúce symbolické konštanty:

S_IRWXU

00700 používateľ (vlastník súboru) čítal, zapisoval a vykonal povolenie

S_IRUSR (S_IREAD)

00400 používateľ má povolenie na čítanie

S_IWUSR (S_IWRITE)

Používateľ má povolenie na písanie

S_IXUSR (S_IEXEC)

00100 používateľ má povolenie na vykonanie

S_IRWXG

Skupina 00070 čítala, písala a vykonávala povolenie

S_IRGRP

Skupina 00040 má povolenie na čítanie

S_IWGRP

Skupina 00020 má povolenie na písanie

S_IXGRP

Skupina 00010 má povolenie na vykonanie

S_IRWXO

00007 iní čítajú, píšu a vykonávajú povolenie

S_IROTH

00004 ostatné majú povolenie na čítanie

S_IWOTH

00002 iní majú povolenie na písanie

S_IXOTH

00001 iní majú povolenie na vykonanie

musí byť špecifikovaný, keď je O_CREAT v príznakoch a inak sa ignoruje.

kreat je ekvivalentný otvoriť s vlajkami rovnajúcim sa O_CREAT | O_WRONLY | O_TRUNC .

RETURN HODNOTA

open a creat vráťte nový deskriptor súborov, alebo -1, ak sa vyskytla chyba (v takom prípade je chyba nastavená správne). Všimnite si, že otvorené môžu otvoriť špeciálne súbory zariadenia, ale creat ich nemôže vytvoriť - namiesto toho použite mknod (2).

Na systémoch súborov NFS s povoleným mapovaním UID môže otvorené popisovač súborov vrátiť, ale napr. Čítať (2) žiadosti boli EACCES zamietnuté. Je to preto, lebo klient kontroluje povolenia otvoreným , ale mapovanie UID vykoná server na základe požiadaviek na čítanie a zápis.

Ak je súbor novo vytvorený, jeho polia atime, ctime, mtime sú nastavené na aktuálny čas a rovnako sú polia ctime a mtime v nadradenom adresári. V opačnom prípade, ak je súbor upravený z dôvodu príznaku O_TRUNC, jeho políčka ctime a mtime sú nastavené na aktuálny čas.

chyby

EEXIST

názov cesty už existuje a používajú sa O_CREAT a O_EXCL .

EISDIR

názov cesty odkazuje na adresár a požadovaný prístup zahŕňa písanie (to znamená O_WRONLY alebo O_RDWR je nastavené).

EACCES

Požadovaný prístup do súboru nie je povolený, alebo jeden z adresárov v názve cesty neumožnil povolenie na vyhľadávanie (spúšťanie), alebo súbor ešte neexistoval a prístup na zápis do nadradeného adresára nie je povolený.

ENAMETOOLONG

cesta bola príliš dlhá.

ENOENT

O_CREAT nie je nastavený a pomenovaný súbor neexistuje. Prípadná zložka adresára v názve cesty neexistuje alebo je symbolický odkaz.

ENOTDIR

Komponent používaný ako adresár v názve cesty nie je v skutočnosti adresár alebo bol zadaný O_DIRECTORY a názov cesty nebol adresár.

ENXIO

O_NONBLOCK | O_WRONLY je nastavený, pomenovaný súbor je FIFO a žiadny proces nemá súbor otvorený na čítanie. Alebo je súbor špeciálny súbor zariadenia a neexistuje žiadne zodpovedajúce zariadenie.

ENODEV

názov cesty odkazuje na špeciálny súbor zariadenia a neexistuje žiadne zodpovedajúce zariadenie. (Toto je chyba jadra systému Linux - v takejto situácii musí byť ENXIO vrátená.)

EROFS

názov cesty odkazuje na súbor v súborovom systéme len na čítanie a bol požadovaný prístup na zápis.

ETXTBSY

názov cesty označuje spustiteľný obrázok, ktorý sa práve vykonáva a bol požadovaný prístup na zápis.

EFAULT

body cesty mimo vášho prístupného adresového priestoru.

ELOOP

Pri riešení názvu cesty sa vyskytlo príliš veľa symbolických odkazov alebo bol zadaný parameter O_NOFOLLOW, ale názov cesty bol symbolický odkaz.

ENOSPC

cesta má byť vytvorená, ale zariadenie obsahujúce cestu nemá priestor pre nový súbor.

enom

Nedostatočná pamäť jadra bola k dispozícii.

EMFILE

Proces má už otvorený maximálny počet súborov.

ENFILE

Bolo dosiahnuté obmedzenie celkového počtu otvorených súborov v systéme.

V súlade s

SVR4, SVID, POSIX, X / OPEN, BSD 4.3 Označenia O_NOFOLLOW a O_DIRECTORY sú špecifické pre Linux . Možno budete musieť definovať makro _GNU_SOURCE a získať ich definície.

obmedzenia

Existuje veľa nepriaznivostí v protokole, ktorý je základom systému NFS, čo ovplyvňuje okrem iného O_SYNC a O_NDELAY .

POSIX poskytuje tri rôzne varianty synchronizovaných I / O, ktoré zodpovedajú príznakom O_SYNC , O_DSYNC a O_RSYNC . V súčasnosti (2.1.130) sú všetky v systéme Linux synonymom.