Naučte se otevřít příkaz Linux

Synopse

#include << A HREF = "soubor: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "soubor: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "soubor: /usr/include/fcntl.h"> fcntl.h> int otevřený (const char * pathname , int flags ); int otevřený (const char * pathname , int flags , mode_t mode ); int creat (const char * pathname , mode_t );

Popis

Příkaz open () system call linux se používá k převodu názvu cesty do deskriptoru souboru (malé, ne záporné číslo pro použití v následných I / O, jako při čtení , zápisu atd.). Po úspěšném volání se popisovač souboru vrátí jako nejnižší deskriptor souboru, který není aktuálně otevřen pro daný proces. Toto volání vytvoří nový otevřený soubor, který není sdílen s žádným jiným procesem. (Souběžně otevřené soubory mohou vzniknout prostřednictvím systémového volání vidlice (2).) Nový deskriptor souboru je nastaven tak, aby zůstal otevřený přes funkce exec (viz fcntl (2)). Posun souboru je nastaven na začátek souboru.

Parametry příznaků jsou jeden z O_RDONLY , O_WRONLY nebo O_RDWR, které požadují otevření souboru pouze pro čtení, zápis pouze nebo čtení / zápis, respektive, bitwise- nebo 'd s nulou nebo více z následujícího:

O_CREAT

Pokud soubor neexistuje, bude vytvořen. Vlastník (ID uživatele) souboru je nastaven na efektivní uživatelské ID procesu. Vlastnictví skupiny (ID skupiny) je nastaveno buď na aktivní ID skupiny procesu nebo na ID skupiny nadřazeného adresáře (v závislosti na typu souborového systému a volbách připojení a režimu nadřazeného adresáře, viz např. Mount možnosti bsdgroups a sysvgroups souborového systému ext2, jak je popsáno v mount (8)).

O_EXCL

Při použití s příponou O_CREAT , pokud soubor již existuje, je to chyba a otevření se nezdaří. V tomto kontextu existuje symbolické spojení, bez ohledu na to, odkud jeho body. O_EXCL je poškozen na souborových systémech NFS , programy, které se na něj spoléhají při provádění blokovacích úloh, budou obsahovat podmínku závodu. Řešení pro provádění blokování atomového souboru pomocí uzamčení souboru je vytvoření jedinečného souboru ve stejném fs (např. S ​​názvem hostitele a pid), použijte odkaz (2) pro vytvoření odkazu na uzamčený soubor. Pokud odkaz () vrací 0, zámek je úspěšný. V opačném případě použijte stat (2) na jedinečném souboru, abyste zkontrolovali, zda se jeho počet odkazů zvýšil na 2, v takovém případě je zámek také úspěšný.

O_NOCTTY

Pokud název cesty odkazuje na terminálové zařízení --- viz tty (4) --- nebude se stát kontrolním terminálem procesu, i když proces nemá jeden.

O_TRUNC

Pokud soubor již existuje a je běžným souborem a otevřený režim umožňuje zápis (tj. Je O_RDWR nebo O_WRONLY), bude zkrácen na délku 0. Pokud je soubor FIFO nebo soubor terminálového zařízení, ignoruje se příznak O_TRUNC. V opačném případě není účinek O_TRUNC blíže specifikován. (U mnoha verzí systému Linux bude ignorováno, v jiných verzích se vrátí chyba.)

O_APPEND

Soubor je otevřen v režimu připojení. Před každým zápisem je ukazatel souboru umístěn na konci souboru, jako v případě lseek . O_APPEND může vést k poškozeným souborům v systémech souborů NFS, pokud více než jeden proces připojí data k souboru najednou. Důvodem je to, že NFS nepodporuje připojení k souboru, takže jádro klienta musí simulovat, což nelze provést bez závodu.

O_NONBLOCK nebo O_NDELAY

Pokud je to možné, soubor je otevřen v režimu neblokování. Ani otevřená, ani žádná další operace s popisem souboru, který je vrácena, způsobí, že proces volání čekat. Pro manipulaci s FIFO (pojmenované trubky) viz také fifo (4). Tento režim nemusí mít žádný vliv na soubory jiné než FIFO.

O_SYNC

Soubor je otevřen pro synchronní I / O. Jakékoliv zápisy na výsledném deskriptoru souborů zablokují volání, dokud data nebudou fyzicky zapsána do základního hardwaru. Viz omezení níže.

O_NOFOLLOW

Pokud název cesty je symbolický odkaz, otevře se otevřené. Jedná se o rozšíření FreeBSD, které bylo přidáno do verze 2.1.126. Symbolické odkazy v dřívějších složkách cesty budou nadále dodržovány. Záhlaví z glibc 2.0.100 a novější obsahují definici této příznaku; jádra před 2.1.126 budou ignorovány, pokud budou použity .

O_DIRECTORY

Pokud název cesty není adresář, způsobte selhání otevřené. Tento příznak je specifický pro systém Linux a byl přidán do jádra verze 2.1.126, aby se zabránilo problémům s odmítnutím služby, pokud je opendir (3) volán na FIFO nebo páskovém zařízení, ale neměl by být použit mimo implementaci opendir .

O_DIRECT

Zkuste minimalizovat efekty vyrovnávací paměti vstupů a výstupů z tohoto souboru. Obecně to zhoršuje výkon, ale je užitečné ve zvláštních situacích, například když aplikace dělají vlastní ukládání do mezipaměti. Soubor I / O se provádí přímo z vyrovnávací paměti uživatelského prostoru. I / O je synchronní, tj. Po dokončení čtení (2) nebo zápisu (2) volání systému, jsou zaručena data přenosu. Velikosti přenosu a vyrovnání uživatelského vyrovnávací paměti a posunu souboru musí být násobky velikosti logického bloku souborového systému.
Tento příznak je podporován na mnoha systémech typu Unix; podpora byla přidána pod linuxem v jádře verze 2.4.10.
Sématicky podobné rozhraní pro bloková zařízení je popsáno v surovém (8).

O_ASYNC

Generujte signál (ve výchozím nastavení je SIGIO, ale toto může být změněno pomocí fcntl (2)), když je vstup nebo výstup možný v tomto deskriptoru souboru. Tato funkce je k dispozici pouze pro terminály, pseudo-terminály a zásuvky. Další informace naleznete v části fcntl (2).

O_LARGEFILE

Na 32bitových systémech, které podporují systém velkých souborů, povolte otevření souborů, jejichž velikosti nelze zobrazit v 31 bitových souborech.

Některé z těchto volitelných příznaků lze změnit po použití souboru fcntl po otevření souboru.

Režim argumentu určuje oprávnění k použití v případě vytvoření nového souboru. Umask je modifikován obvyklým způsobem: oprávnění vytvořeného souboru jsou (režim & ~ umask) . Tento režim platí pouze pro budoucí přístupy nově vytvořeného souboru. otevřený hovor, který vytvoří soubor pouze pro čtení, může vrátit popisovač souboru pro čtení a zápis.

Pro režim jsou uvedeny následující symbolické konstanty:

S_IRWXU

00700 uživatel (vlastník souboru) číst, zapisovat a provádět oprávnění

S_IRUSR (S_IREAD)

Uživatel 00400 má oprávnění ke čtení

S_IWUSR (S_IWRITE)

Uživatel má oprávnění k zápisu

S_IXUSR (S_IEXEC)

00100 uživatel má oprávnění k provádění

S_IRWXG

Skupina 00070 čte, zapisuje a provede oprávnění

S_IRGRP

Skupina 00040 má oprávnění ke čtení

S_IWGRP

Skupina 00020 má oprávnění k zápisu

S_IXGRP

Skupina 00010 má oprávnění k provádění

S_IRWXO

00007 Ostatní mají oprávnění číst, psát a spouštět

S_IROTH

00004 ostatní mají povolení ke čtení

S_IWOTH

00002 ostatní mají povolení k zápisu

S_IXOTH

00001 ostatní mají oprávnění k provedení

režim musí být zadán, když je O_CREAT v příznaku a jinak je ignorován.

creat odpovídá otevření s příznaky rovnající se O_CREAT | O_WRONLY | O_TRUNC .

ZPĚTNÁ HODNOTA

open a creat vrátí nový deskriptor souboru nebo -1, pokud dojde k chybě (v takovém případě je chyba nastavena správně). Všimněte si, že otevřené mohou otevřít speciální soubory zařízení, ale creat je nemůže vytvořit - místo toho použijte mknod (2).

Na souborových systémech NFS s povoleným mapováním UID může otevřený deskriptor souboru vrátit, ale např. Požadavky na čtení (2) jsou EACCES zamítnuty. Důvodem je to, že klient provádí otevření pomocí kontroly oprávnění, ale mapování UID provádí server na základě požadavků na čtení a zápis.

Pokud je soubor nově vytvořen, jeho pole atime, ctime, mtime jsou nastaveny na aktuální čas a stejně tak jsou pole ctime a mtime nadřazeného adresáře. V opačném případě, pokud je soubor změněn kvůli příznaku O_TRUNC, jeho pole ctime a mtime jsou nastaveny na aktuální čas.

Chyby

EEXIST

cesta již existuje a byly použity O_CREAT a O_EXCL .

EISDIR

název cesty odkazuje na adresář a požadovaný přístup zahrnuje zápis (tj. O_WRONLY nebo O_RDWR je nastaven).

EACCES

Požadovaný přístup k souboru není povolen, nebo jeden z adresářů v cestě neumožnil oprávnění pro vyhledávání (spuštění) nebo soubor dosud neexistoval a přístup k zápisu do nadřazeného adresáře není povolen.

ENAMETOOLONG

cesta byla příliš dlouhá.

ENOENT

O_CREAT není nastavena a pojmenovaný soubor neexistuje. Nebo složka adresáře v názvu cesty neexistuje nebo je visící symbolický odkaz.

ENOTDIR

Komponenta používaná jako adresář v názvu cesty není ve skutečnosti adresář nebo byl zadán parametr O_DIRECTORY a cesta nebyla adresářem.

ENXIO

O_NONBLOCK | O_WRONLY je nastaven, jmenovaný soubor je FIFO a žádný proces nemá soubor otevřený pro čtení. Nebo soubor je speciální soubor zařízení a neexistuje odpovídající zařízení.

ENODEV

cesta označuje speciální soubor zařízení a neexistuje odpovídající zařízení. (Jedná se o chybu jádra systému Linux - v takovém případě musí být ENXIO vrácena.)

EROFS

název cesty odkazuje na soubor v souborovém systému jen pro čtení a byl požadován přístup k zápisu.

ETXTBSY

název cesty označuje spustitelný obrázek, který je aktuálně spuštěn a požadavek zápisu byl požadován.

EFAULT

body cesty mimo přístupný adresový prostor.

ELOOP

Příliš mnoho symbolických odkazů bylo zjištěno při vyřešení názvu cesty nebo byla zadána hodnota O_NOFOLLOW, ale název cesty byl symbolický odkaz.

ENOSPC

cesta má být vytvořena, ale zařízení obsahující cestu nemá prostor pro nový soubor.

ENOMEM

Nedostatečná paměť jádra byla k dispozici.

EMFILE

Proces již má otevřený maximální počet souborů.

ENFILE

Byla dosažena omezení celkového počtu souborů otevřených v systému.

V souladu s

SVR4, SVID, POSIX, X / OPEN, BSD 4.3 Příznaky O_NOFOLLOW a O_DIRECTORY jsou specifické pro systém Linux . Pro získání jejich definic může být definováno makro _GNU_SOURCE .

Omezení

V protokolu, který je základem systému souborů NFS, existuje mnoho nepřesností , které ovlivňují mimo jiné O_SYNC a O_NDELAY .

POSIX poskytuje tři různé varianty synchronizovaných I / O, které odpovídají příznakům O_SYNC , O_DSYNC a O_RSYNC . V současné době (2.1.130) jsou všechny v Linuxu synonymem.