Leer die Linux Command Open

opsomming

#include << A HREF = "lêer: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "lêer: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "lêer: /usr/include/fcntl.h"> fcntl.h> int open (const char * padnaam , int vlae ); int oop (const char * padnaam , int vlae , modus_t modus ); int-skepper (const char * padnaam , modus_t- modus );

beskrywing

Die opdrag () stelseloproep Linux- opdrag word gebruik om 'n padnaam in 'n lêerbeskrywer te omskep ('n klein, nie-negatiewe heelgetal vir gebruik in die daaropvolgende I / O soos met lees , skryf , ens.). Wanneer die oproep suksesvol is, sal die beskrywing van die lêerbeskrywer die laagste lêerbeskrywer wees wat tans nie oop is vir die proses nie. Hierdie oproep skep 'n nuwe oop lêer, wat nie met enige ander proses gedeel word nie. (Maar gedeelde oop lêers kan ontstaan ​​via die vurk (2) stelseloproep.) Die nuwe lêerbeskrywer sal oop bly oor die eksterne funksies (sien fcntl (2)). Die lêer offset is ingestel aan die begin van die lêer.

Die parametervlae is een van O_RDONLY , O_WRONLY of O_RDWR, wat versoek om die lêer slegs-lees, skryf-alleen of lees / skryf, onderskeidelik, bietjie of d met nul of meer van die volgende te open:

O_CREAT

As die lêer nie bestaan ​​nie, sal dit geskep word. Die eienaar (gebruikersnaam) van die lêer is ingestel op die effektiewe gebruikers-ID van die proses. Die groepeienaarskap (groep ID) word óf ingestel op die effektiewe groep ID van die proses of na die groep ID van die ouergids (afhangende van die tipe lêerstelsel en bergopties en die modus van die ouergids, sien bv. Die berg opsies bsdgroups en sysvgroups van die ext2 lêersisteem, soos beskryf in die berg (8)).

O_EXCL

As dit gebruik word met O_CREAT , as die lêer reeds bestaan, is dit 'n fout en die oop sal misluk. In hierdie konteks bestaan ​​daar 'n simboliese skakel, ongeag waar dit na verwys. O_EXCL is gebreek op NFS-lêerstelsels , programme wat daarop staatmaak om slotwerk te verrig, sal 'n wedloopstoestand bevat. Die oplossing vir die uitvoer van atoomlêer met behulp van 'n sluitlêer is om 'n unieke lêer op dieselfde fs te skep (bv. Om gasheernaam en pid in te sluit), gebruik skakel (2) om 'n skakel na die sluitlêer te maak. As die skakel () 0 oplevert, is die slot suksesvol. Andersins, gebruik stat (2) op die unieke lêer om te kontroleer of sy koppeltelling tot 2 toegeneem het, in welke geval die slot ook suksesvol is.

O_NOCTTY

As padnaam verwys na 'n terminale toestel --- sien tty (4) --- dit sal nie die proses se beheerterminal word nie, al is die proses nie een nie.

O_TRUNC

As die lêer reeds bestaan ​​en 'n gereelde lêer is en die oop modus toelaat om te skryf (dit wil sê, is O_RDWR of O_WRONLY), word dit afgekort tot lengte 0. As die lêer 'n FIFO- of terminale toestellêer is, word die O_TRUNC-vlag geïgnoreer. Anders is die effek van O_TRUNC ongespesifiseerde. (Op baie Linux weergawes sal dit geïgnoreer word; op ander weergawes sal dit 'n fout terugbring.)

O_APPEND

Die lêer word geopen in die byvoegmodus. Voor elke skryf word die lêerwyser aan die einde van die lêer geplaas, asof met lseek . O_APPEND kan lei tot beskadigde lêers op NFS-lêerstelsels as meer as een proses gelyktydig data na 'n lêer byvoeg . Dit is omdat NFS nie byvoeg by 'n lêer nie, dus moet die kliënt kern dit simuleer, wat nie sonder 'n wedloopstoestand gedoen kan word nie.

O_NONBLOCK of O_NDELAY

As dit moontlik is, word die lêer oopgemaak in nie-blokkeer modus. Nóg die ope of enige verdere bewerkings op die lêerbeskrywer wat teruggestuur word, sal veroorsaak dat die roepproses wag. Vir die hantering van EIEU's (genoem pype), sien ook fifo (4). Hierdie modus hoef geen effek op lêers anders as EIEU's te hê nie.

O_SYNC

Die lêer word geopen vir sinkroniese I / O. Enige skrif s op die resulterende lêerbeskrywer sal die oproepproses blokkeer totdat die data fisies aan die onderliggende hardeware geskryf is. Sien egter BEPERKINGS hieronder.

O_NOFOLLOW

As padnaam 'n simboliese skakel is, misluk die oopmaak. Hierdie is 'n FreeBSD-uitbreiding, wat by Linux in weergawe 2.1.126 gevoeg is. Simboliese skakels in vroeëre komponente van die padnaam sal steeds gevolg word. Die hoofde van glibc 2.0.100 en later sluit 'n definisie van hierdie vlag in; pitte voor 2.1.126 sal dit ignoreer as dit gebruik word .

O_DIRECTORY

As padnaam nie 'n gids is nie, maak dit oop om te misluk. Hierdie vlag is Linux-spesifiek en is bygevoeg in kern weergawe 2.1.126 om ontkenningsdiensprobleme te voorkom as opendir (3) op 'n FIFO of bandtoestel gebruik word, maar moet nie buite die implementering van oopendir gebruik word nie. .

O_DIRECT

Probeer om die kas-effekte van die I / O van en na hierdie lêer te verminder. Oor die algemeen sal dit prestasie degrader, maar dit is nuttig in spesiale situasies, soos wanneer aansoeke hul eie caching doen. Lêer I / O word direk na / vanaf gebruikerruimtebuffers gedoen. Die I / O is sinchroon, dws by die voltooiing van die lees (2) of skryf (2) stelseloproep is data gewaarborg om oorgedra te wees. Oordraggroottes, en die belyning van gebruikerbuffer en lêerverskil moet almal veelvoude wees van die logiese blokgrootte van die lêerstelsel.
Hierdie vlag word ondersteun op 'n aantal Unix-agtige stelsels; Ondersteuning is bygevoeg onder Linux in kern weergawe 2.4.10.
'N Semanties soortgelyke koppelvlak vir bloktoestelle word in rou (8) beskryf.

O_ASYNC

Genereer 'n sein (SIGIO by verstek, maar dit kan verander word via fcntl (2)) wanneer invoer of uitvoer moontlik op hierdie lêerbeskrywer word. Hierdie funksie is slegs beskikbaar vir terminale, pseudo-terminale en voetstukke. Sien fcntl (2) vir verdere besonderhede.

O_LARGEFILE

Op 32-bis stelsels wat die Large Files-stelsel ondersteun, kan lêers waarvan die groottes nie in 31 bisse voorgestel kan word, oopgemaak word.

Sommige van hierdie opsionele vlae kan verander word met behulp van fcntl nadat die lêer oopgemaak is.

Die argumentmodus spesifiseer die regte om te gebruik as 'n nuwe lêer geskep word. Dit word op die gewone manier gewysig deur die proses se umask : die permissies van die geskep lêer is (modus en ~ umask) . Let daarop dat hierdie modus slegs van toepassing is op toekomstige toegang tot die nuutgeskepte lêer; Die oproep wat 'n leesalleen-lêer skep, kan moontlik 'n lees / skryf lêerbeskrywer terugbring.

Die volgende simboliese konstantes word vir modus voorsien :

S_IRWXU

00700 gebruiker (lêer eienaar) het toestemming gelees, skryf en uitvoer

S_IRUSR (S_IREAD)

00400 gebruiker het toestemming vir lees

S_IWUSR (S_IWRITE)

00200 gebruiker het skryf toestemming

S_IXUSR (S_IEXEC)

00100 gebruiker het uitvoer toestemming

S_IRWXG

00070 groep het toestemming gelees, skryf en uitvoer

S_IRGRP

00040 groep het lees toestemming

S_IWGRP

00020 groep het skryf toestemming

S_IXGRP

00010 groep het uitvoer toestemming

S_IRWXO

00007 ander het toestemming gelees, geskryf en uitgevoer

S_IROTH

00004 ander het lees toestemming

S_IWOTH

00002 ander skryf toestemming

S_IXOTH

00001 ander het uitvoer toestemming

modus moet gespesifiseer word wanneer O_CREAT in die vlae is , en word andersins geïgnoreer.

skepper is gelykstaande aan oop met vlae gelyk aan O_CREAT | O_WRONLY | O_TRUNC .

TERUGWAARDE

oop en skep die nuwe lêerbeskrywer terug, of -1 as daar 'n fout opgetree het (in welke geval errno toepaslik gestel is). Let daarop dat oop kan toestel spesiale lêers oopmaak, maar skepper kan dit nie skep nie - gebruik mknod (2) instead.

Op NFS-lêerstelsels met UID-kartering geaktiveer, kan oop ' n lêerbeskrywer terugbesorg word, maar bv. Lees (2) word versoeke geweier met EACCES . Dit is omdat die kliënt oopmaak deur die toestemmings te keur, maar UID-kartering word deur die bediener uitgevoer tydens lees- en skryfversoeke.

As die lêer nuut geskep is, is sy atime, ctime, mtime velde ingestel op die huidige tyd, en so is die ctime en mtime velde van die ouergids. Anders, as die lêer gewysig is as gevolg van die O_TRUNC-vlag, is die ctime en mtime-velde op die huidige tyd ingestel.

foute

EEXIST

Padnaam bestaan ​​reeds en O_CREAT en O_EXCL is gebruik.

EISDIR

Padnaam verwys na 'n gids en die toegang wat versoek is om betrokke te skryf (dit is OWWONLY of O_RDWR is ingestel).

EACCES

Die versoekte toegang tot die lêer is nie toegelaat nie, of een van die dopgehou in die padnaam het nie toestemming verleen om toestemming te verleen nie, of die lêer het nog nie bestaan ​​nie en skryf toegang tot die ouergids is nie toegelaat nie.

ENAMETOOLONG

Padnaam was te lank.

ENOENT

O_CREAT is nie ingestel nie en die genoemde lêer bestaan ​​nie. Of 'n gidskomponent in die padnaam bestaan ​​nie of is 'n skrikwekkende simboliese skakel nie.

ENOTDIR

'N Komponent wat as 'n gids in padnaam gebruik word, is nie, in werklikheid, 'n gids nie, of O_DIRECTORY is gespesifiseer en padnaam was nie 'n gids nie.

ENXIO

O_NONBLOCK | O_WRONLY is ingestel, die genoemde lêer is 'n EIEU en geen proses het die lêer oop vir lees nie. Of die lêer is 'n toestel spesiaal lêer en daar bestaan ​​geen ooreenstemmende toestel nie.

ENODEV

padnaam verwys na 'n toestel spesiale lêer en geen ooreenstemmende toestel bestaan ​​nie. (Dit is 'n Linux-kern fout - in hierdie situasie moet ENXIO teruggestuur word.)

EROFS

padnaam verwys na 'n lêer op 'n leesalleen-lêerstelsel en skryf toegang is aangevra.

ETXTBSY

padnaam verwys na 'n uitvoerbare beeld wat tans uitgevoer word en skryf toegang is aangevra.

EFAULT

Padnaampunte buite jou toeganklike adresruimte.

ELOOP

Te veel simboliese skakels is ondervind met die oplos van padnaam , of O_NOFOLLOW is gespesifiseer, maar padnaam was 'n simboliese skakel.

ENOSPC

Padnaam moet geskep word, maar die toestel wat padnaam bevat, het geen plek vir die nuwe lêer nie.

ENOMEM

Onvoldoende kerngeheue was beskikbaar.

EMFILE

Die proses het reeds die maksimum aantal lêers oop.

ENFILE

Die limiet op die totale aantal lêers wat op die stelsel oop is, is bereik.

Voldoening aan

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 Die O_NOFOLLOW en O_DIRECTORY vlae is Linux- spesifieke. Miskien moet jy die _GNU_SOURCE- makro omskryf om hul definisies te kry.

Beperkings

Daar is baie infelicities in die protokol onderliggend aan NFS, onder andere O_SYNC en O_NDELAY .

POSIX maak voorsiening vir drie verskillende variante van gesinchroniseerde I / O, wat ooreenstem met die vlae O_SYNC , O_DSYNC en O_RSYNC . Tans (2.1.130) is dit almal sinoniem onder Linux.