Skip to main content

Otvorte príkaz Linux Command a Unix Command

Anonim

synopse

#include #include #include int otvorené (const char * pathname , int flags ); int otvorené (const char * pathname , int flags , mode_t režim ); int creat (const char * pathname , mode_t režim );

popis

otvorené() príkaz system call 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 v prípade prečítať, zapísať, 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íctvomvidlička(2) systémové volanie.) Nový deskriptor súborov je nastavený tak, aby zostal otvorený pre všetky funkcie exec (viďfcntl(2)). Posun súboru je nastavený na začiatok súboru.

Parameter flags je jeden zO_RDONLY, O_WRONLY aleboO_RDWR ktoré vyžadujú otvorenie súboru len na čítanie, zápis iba na čítanie alebo zápis, resp. alebo 'd s nulou alebo viacerými z nasledujúcich hodnôt:

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 opísané vkôň(8)).

O_EXCL

Pri použití sO_CREAT, ak súbor už existuje, je to chyba aotvorené 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í zámkových úloh, budú obsahovať podmienku pretekov. Riešením na vykonanie uzamknutia atómových súborov pomocou uzamykacieho 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. aklink () vráti 0, zámok je úspešný. V opačnom prípade použite stat(2) na jedinečnom súbore, aby sa skontrolovalo, či sa jeho počet odkazov zvýšil na 2, v takom prípade je zámok úspešný.

O_NOCTTY

ak pathname označuje koncové zariadenie --- viďtty(4) --- to sa nestane kontrolným 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 (to znamená 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ýmzapísať, ukazovateľ súboru je umiestnený na konci súboru, ako keby to bololseek. 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 aleboO_NDELAY

Ak je to možné, súbor sa otvorí v režime bez blokovania. Aniotvorené ani žiadne následné operácie s popisom súboru, ktorý je vrátený, spôsobí, že proces volania čaká. Informácie o manipulácii s FIFO (nazývané potrubia) nájdete tiež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ľvekzapísaťs na výslednom deskriptore súborov zablokuje proces volania, kým sa údaje fyzicky nezapíšu do základného hardvéru. Pozrite si však tieto obmedzenia:

O_NOFOLLOW

ak pathname je symbolické prepojenie, potom 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 pathname nie je adresár, spôsobí zlyhanie otvoreného súboru. 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, akopendir(3) sa volá na FIFO alebo páskové zariadenie, ale nesmie sa používať mimo implementácieopendir.

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. Vstup / výstup je synchrónny, t.j. po dokončení prečítať(2) alebozapísať(2) systémové volanie, dáta sú 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é vsurový(8).

O_ASYNC

Generovanie signálu (predvolene SIGIO, ale toto môže byť zmenené cezfcntl(2)), ak je vstup alebo výstup možný na tomto deskriptore. Táto funkcia je dostupná iba pre terminály, pseudonávody a zásuvky. vidieťfcntl(2) pre ďalšie podrobnosti.

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 je možné meniť pomocoufcntl po otvorení súboru.

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

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

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

režim musí byť zadané, keďO_CREAT je v flags , a inak sa ignoruje.

creat je ekvivalentnáotvorené s flags rovnáO_CREAT | O_WRONLY | O_TRUNC.

RETURN HODNOTA

otvorené acreat vrátiť nový deskriptor súborov alebo -1, ak sa vyskytla chyba (v takom prípade, errno je nastavená správne). Poznač si tootvorené môže otvoriť špeciálne súbory zariadenia, alecreat nemôže ich vytvoriť - používaťmknod(2).

Na súborových systémoch NFS s mapovaním UID povolené,otvorené môže vrátiť deskriptor súborov, ale napr. prečítať(2) žiadosti boli zamietnutéEACCES, Je to preto, že klient vykonávaotvorené začiarknutím povolenia, ale mapovanie UID vykoná server na základe požiadaviek na čítanie a písanie.

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

pathname už existuje aO_CREAT aO_EXCL boli použité.

EISDIR

pathname odkazuje na adresár a požadovaný prístup zahŕňal písanie (to znamená,O_WRONLY aleboO_RDWR je nastavené).

EACCES

Požadovaný prístup do súboru nie je povolený, alebo jeden z adresárov v priečinku pathname nepovolil povolenie na vyhľadávanie (spúšťanie) alebo súbor zatiaľ neexistoval a prístup na zápis do nadradeného adresára nie je povolený.

ENAMETOOLONG

pathname bola príliš dlhá.

ENOENT

O_CREAT nie je nastavený a pomenovaný súbor neexistuje. Alebo zložka adresára v priečinku pathname neexistuje alebo je visiace symbolické spojenie.

ENOTDIR

Komponent použitý ako adresár v pathname nie je v skutočnosti adresár, aleboO_DIRECTORYbol špecifikovaný a pathname 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

pathname 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

pathname sa vzťahuje na súbor v súborovom systéme len na čítanie a bol požadovaný prístup na zápis.

ETXTBSY

pathname odkazuje na spustiteľný obrázok, ktorý sa momentálne vykonáva a bol požadovaný prístup na zápis.

EFAULT

pathname bodov mimo vášho prístupného adresového priestoru.

ELOOP

Pri riešení sa vyskytlo príliš veľa symbolických spojení pathname , aleboO_NOFOLLOW bol špecifikovaný, ale pathname bolo symbolickým odkazom.

ENOSPC

pathname mala byť vytvorená, ale zariadenie obsahujúce pathname nemá nový 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.3O_NOFOLLOW aO_DIRECTORY príznaky sú špecifické pre systém Linux. Možno budete musieť definovať_GNU_SOURCE aby získali svoje definície.

obmedzenia

V protokole, ktorý tvorí základ NFS, existuje veľa nepriaznivostí, ktoré okrem iného ovplyvňujúO_SYNC aO_NDELAY.

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