Ismerje meg a Linux parancs megnyitását

Szinopszis

#include << A HREF = "file: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "fájl: /usr/include/sys/stat.h"> sys / stat.h> #include HREF = "file: /usr/include/fcntl.h"> fcntl.h> int megnyílik (const char * elérési út , int flag ); int megnyitva (const char * elérési út , int flag , mód_t mód ); int creat (const char * elérési út , mód_t mód );

Leírás

A nyílt () rendszerhívás linux parancs segítségével egy elérési utat fájl-leíróvá alakít (egy kicsi, nem negatív egész szám a későbbi I / O-ként való használatra, olvasásra , írásra stb.). Amikor sikeres a hívás, a fájlliterjesztő visszaadja a legalacsonyabb fájlleíró, amely jelenleg nem nyitott a folyamathoz. Ez a hívás új nyitott fájlt hoz létre, amelyet nem lehet megosztani más folyamattal. (De a megosztott nyílt fájlok a villák (2) rendszerhívásán keresztül merülhetnek fel.) Az új fájlleíró nyitva marad az exec függvényeken (lásd: fcntl (2)). A fájl-eltolás beállítása a fájl elejére van állítva.

A paraméterjelzők egyike O_RDONLY , O_WRONLY vagy O_RDWR, amelyek csak olvasható, írható vagy olvasható / írható bit, vagy "d" értéket tartalmaznak, az alábbiak közül nulla vagy több értékkel:

O_CREAT

Ha a fájl nem létezik, akkor létrejön. A fájl tulajdonosának (felhasználói azonosítója) a folyamat tényleges felhasználói azonosítójára van állítva. A csoport tulajdonjoga (csoportazonosító) a folyamat tényleges csoportazonosítójához vagy a szülőkönyvtár csoport azonosítójához (a fájlrendszer típusától és a csatolási beállításoktól függően, valamint a szülőkönyvtár módjától függően lásd például a csatolást az ext2 fájlrendszer opciók bsdgroups és sysvgroups , a mount (8) függvényében ).

O_EXCL

Az O_CREAT használatakor , ha a fájl már létezik, hiba, és a nyitott program meghibásodik. Ebben az összefüggésben létezik egy szimbolikus kapcsolat, függetlenül attól, hogy hol hivatkozik rá. Az O_EXCL meghibásodott az NFS fájlrendszereken , az olyan programok, amelyek a lezárási feladatok elvégzésére támaszkodnak, versenyfeltételeket tartalmaznak. A lezárási fájl használatával végrehajtott atomfájl-lezárás megoldása egy egyedi fájl létrehozása ugyanazon fs-en (pl. Hostname és pid), link használatához (2) a zárfájlhoz való link létrehozásához. Ha a kapcsolat () 0 értéket ad vissza, a zár sikeres. Ellenkező esetben az stat fájlban (2) az egyedi fájlban ellenőrizze, hogy a kapcsolat száma 2-re nőtt-e, ez esetben a zár is sikeres.

O_NOCTTY

Ha az elérési út egy terminál eszközre utal - lásd tty (4) --- akkor sem válik a folyamat vezérlő termináljává akkor sem, ha a folyamatnak nincsen.

O_TRUNC

Ha a fájl már létezik, és egy szabályos fájl, és a nyílt mód lehetővé teszi az írást (pl. O_RDWR vagy O_WRONLY), a csonkolás a 0. hossza lesz. Ha a fájl FIFO vagy terminál eszköz fájl, akkor az O_TRUNC jelzőt figyelmen kívül hagyja. Ellenkező esetben az O_TRUNC hatása nem meghatározott. (Sok Linux verziónál figyelmen kívül hagyja, más verziók esetén hibát fog kapni.)

O_APPEND

A fájl megnyitása függő módban történik. Minden egyes írást megelőzően a fájl mutatója a fájl végén található, mintha az lseek . Az O_APPEND az NFS fájlrendszerekben sérült fájlokat eredményezhet, ha egynél több folyamat egyidejűleg adatot ad hozzá egy fájlhoz. Ez azért van így, mert az NFS nem támogatja a fájlhoz való csatolását, ezért az ügyfélkernelnek szimulálnia kell azt, ami nem lehetséges versenyhelyzet nélkül.

O_NONBLOCK vagy O_NDELAY

Ha lehetséges, a fájl nem blokkoló üzemmódban nyílik meg. Sem a megnyitott file-leíró, sem a megnyitott műveletek, sem a későbbi műveletek nem okozzák a hívás folyamatát. A FIFO-k (nevezett csövek) kezelésére lásd még a FIFO-t (4). Ennek a módnak nincs hatása a FIFO-któl eltérő fájlokra.

O_SYNC

A fájl megnyílik a szinkron I / O-hoz. A létrehozott fájlleíró bármelyik írása blokkolja a hívási folyamatot, amíg az adatok fizikailag nem íródnak az alatta lévő hardverre. Lásd a KORLÁTOZÁSOK alább.

O_NOFOLLOW

Ha az elérési út egy szimbolikus link, akkor a nyitó sikertelen. Ez egy FreeBSD kiterjesztés, amelyet a 2.1.126-os verzióhoz adtak a Linuxhoz. A pálya korábbi összetevőinek szimbolikus hivatkozásait továbbra is követni fogják. A glibc 2.0.100 és későbbi fejlécek tartalmazzák a zászló meghatározását; a rendszermagok a 2.1.126 előtt figyelmen kívül hagyják, ha használják .

O_DIRECTORY

Ha az elérési út nem könyvtár, akkor a nyitott program sikertelen. Ez a zászló Linux-specifikus, és a rendszermag 2.1.126 verziójához adódott, hogy elkerülje a szolgáltatás megtagadását, ha a opendir (3) FIFO vagy szalagos eszközre szólít fel, de nem szabad opendir .

O_DIRECT

Próbálja meg minimalizálni az I / O gyorsítótár hatásait ebbe a fájlba. Általánosságban ez csökkenti a teljesítményt, de hasznos speciális helyzetekben, például amikor az alkalmazások saját gyorsítótárakat végeznek. A fájl I / O- t közvetlenül a felhasználói tér pufferekhez / felhasználói felületekből készítik. Az I / O szinkron, vagyis a leolvasott (2) vagy írható (2) rendszerhívás befejezésekor az adatok garantáltan átadásra kerülnek. Az átviteli méret, valamint a felhasználói puffer és a fájl eltolás beállítása mindegyike a fájlrendszer logikai blokkméretének többszöröse lehet.
Ezt a zászlót számos Unix-szerű rendszer támogatja; a Linux 2.4.10-es verziójában támogatást kapott.
A blokkeszközök szemantikailag hasonló felületét nyersen írjuk le (8).

O_ASYNC

Generáljon jelet (SIGIO alapértelmezés szerint, de ez megváltoztatható az fcntl (2) -en keresztül), ha a bemeneti vagy a kimeneti fájl ezen a fájlleíróon lehetséges. Ez a funkció csak a terminálok, pszeudo terminálok és aljzatok számára áll rendelkezésre. További részletekért lásd: fcntl (2).

O_LARGEFILE

A 32 bites rendszereken, amelyek támogatják a nagy fájlrendszereket, olyan fájlokat engedélyeznek, amelyek méretét nem lehet megjeleníteni 31 bitet nyitni.

Néhány ilyen opcionális zászló megváltoztatható az fcntl használatával a fájl megnyitása után.

Az argumentummód megadja az új fájlok létrehozásához szükséges engedélyeket. A folyamatot az eljárás szokásos módon módosítja: a létrehozott fájl engedélyei (mód & ~ umask) . Ne feledje, hogy ez az üzemmód csak az újonnan létrehozott fájl jövőbeli eléréseire vonatkozik; a nyílt hívás, amely csak olvasható fájlt hoz létre, helyrehozhatja az olvasási / írási fájlleírást.

A következő szimbolikus állandók állnak rendelkezésre az üzemmódra :

S_IRWXU

A 00700 felhasználó (fájl tulajdonos) olvasott, ír és végrehajtott engedélyt

S_IRUSR (S_IREAD)

00400 felhasználó olvasási engedélyt kapott

S_IWUSR (S_IWRITE)

A 00200 felhasználónak írási engedélye van

S_IXUSR (S_IEXEC)

00100 felhasználó engedélyt hajt végre

S_IRWXG

00070 csoport olvasott, írható és végrehajtott engedélyt

S_IRGRP

00040 csoport olvasási engedélyt kapott

S_IWGRP

A 00020-as csoportnak írási engedélye van

S_IXGRP

00010 csoport engedélyt hajtott végre

S_IRWXO

00007 mások olvassák, írják és végrehajtják az engedélyt

S_IROTH

00004 mások olvasási engedélyt kaptak

S_IWOTH

00002 mások írási joggal rendelkeznek

S_IXOTH

00001 mások engedélyt hajtottak végre

módot akkor kell megadni, ha az O_CREAT a zászlókban van, és egyébként figyelmen kívül hagyja.

A creat egyenértékű az O_CREAT | O_WRONLY | O_TRUNC- val azonos értékű zászlókkal .

TÖRLÉS ÉRTÉKE

nyitva és creat vissza az új fájlleíró, vagy -1 ha hiba történt (ebben az esetben az errno megfelelően van beállítva). Ne feledje, hogy a nyitott képes megnyitni az eszköz speciális fájljait, de a Creat nem tudja létrehozni őket - inkább használja a mknod (2) parancsot.

Az NFS fájlrendszereken, amelyeken az UID-leképezés engedélyezett, a nyitott fájlok leírása visszaadható, de például az olvasási (2) kérések elutasításra kerülnek az EACCES szolgáltatással . Ez azért van így, mert az ügyfél az engedélyek ellenőrzésével nyitja meg a műveletet, de az UID-leképezést a szerver az olvasási és írási kérések alapján végzi.

Ha a fájl újonnan létrehozva van, az idő, a ctime, az mtime mezők az aktuális időre vannak állítva, és így vannak a szülőkönyvtár ctime és mtime mezői is. Ellenkező esetben, ha a fájl az O_TRUNC jelző miatt módosul, annak ctime és mtime mezői az aktuális időre állnak.

hibák

EEXIST

A elérési útvonal már létezik, és az O_CREAT és az O_EXCL került felhasználásra.

EISDIR

A elérési útvonal egy könyvtárra vonatkozik, és az érintett íráshoz kapcsolódó hozzáférés (azaz O_WRONLY vagy O_RDWR van beállítva).

EACCES

A kért hozzáférés a fájlhoz nem engedélyezett, vagy az elérési útvonal egyik könyvtára nem engedélyezte a keresési (execute) engedélyt, vagy a fájl még nem létezett, és a szülői könyvtárhoz való hozzáférés írása nem megengedett.

ENAMETOOLONG

A pályamenet túl hosszú volt.

ENOENT

Az O_CREAT nincs beállítva, és a megadott fájl nem létezik. Vagy a pathname könyvtár összetevője nem létezik, vagy egy lógó szimbolikus link.

ENOTDIR

A címtár könyvtárában használt összetevő nem egy valóban könyvtár, vagy O_DIRECTORY került megadásra, és a elérési út nem volt könyvtár.

ENXIO

O_NONBLOCK | O_WRONLY van beállítva, a megnevezett fájl FIFO, és egyetlen folyamat sem nyitja meg a fájlt az olvasáshoz. Vagy a fájl egy speciális eszköz, és nincs megfelelő eszköz.

ENODEV

A elérési út egy speciális eszközre utal, és nincs megfelelő eszköz. (Ez egy Linux kernel hiba - ebben az esetben az ENXIO-t vissza kell küldeni.)

EROFS

A elérési út egy csak olvasható fájlrendszeren lévő fájlra vonatkozik, és írási hozzáférést kért.

ETXTBSY

A elérési út egy végrehajtható képre vonatkozik, amely jelenleg fut, és írási hozzáférést kért.

EFAULT

A elérhetõ címtartományon kívüli útvonalnevek

ELOOP

Túl sok szimbolikus kapcsolatot találtunk az útvonalnév feloldásában, vagy az O_NOFOLLOW megadtuk, de a elérési út egy szimbolikus link volt.

ENOSPC

útvonalnevet kellett létrehozni, de az elérési útvonalat tartalmazó eszköznek nincs helye az új fájlnak.

ENOMEM

Nem áll rendelkezésre elegendő kernel memória.

EMFILE

A folyamat már a fájlok maximális számát nyitja meg.

ENFILE

Elértük a rendszeren megnyitott összes fájlra vonatkozó korlátot.

Megfelel a

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 Az O_NOFOLLOW és O_DIRECTORY jelzők Linux -specifikusak. Előfordulhat, hogy meg kell határoznia a _GNU_SOURCE makrót a definíciók megszerzéséhez.

korlátozások

Az NFS alapját képező protokollban sok gondatlanság tapasztalható, amelyek többek között az O_SYNC és az O_NDELAY-ot érintik .

A POSIX a szinkronizált I / O három különböző változatát biztosítja, amelyek megfelelnek az O_SYNC , O_DSYNC és O_RSYNC jelzőknek . Jelenleg (2.1.130) ezek mindegyike Linux alatt áll.