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.