Skip to main content

Open de opdracht Linux Command en Unix

Working with MDB Files in Linux (Juni- 2026)

Working with MDB Files in Linux (Juni- 2026)
Anonim

Korte inhoud

#include #include #include int open (const char * pathname , int vlaggen ); int open (const char * pathname , int vlaggen , mode_t mode ); int creat (const char * pathname , mode_t mode );

Omschrijving

DeOpen() system call linux-opdracht wordt gebruikt om een ​​padnaam naar een bestandsdescriptor te converteren (een klein, niet-negatief geheel getal voor gebruik in de daaropvolgende I / O zoals bij lezen, schrijven, enz.). Wanneer de aanroep succesvol is, zal de geretourneerde bestandsdescriptor de laagste bestanddescriptor zijn die momenteel niet open is voor het proces. Deze oproep maakt een nieuw open bestand aan dat niet met een ander proces wordt gedeeld. (Maar gedeelde open bestanden kunnen via devork(2) systeemaanroep.) De nieuwe bestandsdescriptor is ingesteld om open te blijven in alle exec-functies (ziefcntl(2)). De bestandsverschuiving is ingesteld op het begin van het bestand.

De parameter vlaggen is een vanO_RDONLY, O_WRONLY ofO_RDWR die verzoeken om het bestand alleen-lezen, alleen-lezen of lezen / schrijven, respectievelijk, bitwise- of 'd met nul of meer van het volgende:

O_CREAT

Als het bestand niet bestaat, wordt het gemaakt. De eigenaar (gebruikers-ID) van het bestand wordt ingesteld op de effectieve gebruikers-ID van het proces. Het groepseigendom (groeps-ID) wordt ingesteld op de effectieve groeps-ID van het proces of op de groeps-ID van de bovenliggende map (afhankelijk van het bestandssysteemtype en de mount-opties en de modus van de bovenliggende map, zie bijvoorbeeld de koppeling opties bsdgroups en sysvgroups van het ext2 bestandssysteem, zoals beschreven inberg(8)).

O_EXCL

Wanneer gebruikt metO_CREAT, als het bestand al bestaat, is het een fout en deOpen zal mislukken. In deze context bestaat een symbolische link, ongeacht waar de punten naar verwijzen.O_EXCL is onderbroken op NFS-bestandssystemen, programma's die erop vertrouwen voor het uitvoeren van vergrendelingstaken zullen een raceconditie bevatten. De oplossing voor het uitvoeren van atomic file locking met een lockfile is om een ​​uniek bestand te maken op dezelfde fs (bijv. Met hostname en pid), gebruik link (2) om een ​​link naar de lockfile te maken. Alslink() geeft 0 terug, het slot is succesvol. Anders gebruiken stat(2) over het unieke bestand om te controleren of het aantal verbindingen is toegenomen tot 2, in welk geval het slot ook succesvol is.

O_NOCTTY

Als pathname verwijst naar een terminalapparaat --- zietty(4) --- het wordt niet de controleterminal van het proces, zelfs als het proces er geen heeft.

O_TRUNC

Als het bestand al bestaat en een normaal bestand is en de open modus schrijven toestaat (d.w.z. is O_RDWR of O_WRONLY), wordt het afgekapt naar lengte 0. Als het bestand een FIFO- of terminalapparaatbestand is, wordt de O_TRUNC-vlag genegeerd. Anders is het effect van O_TRUNC niet gespecificeerd. (In veel Linux-versies wordt dit genegeerd, in andere versies wordt een fout geretourneerd.)

O_APPEND

Het bestand wordt geopend in de toevoegmodus. Voor elkschrijven, de bestandsaanwijzer bevindt zich aan het einde van het bestand, alsof metlseek. O_APPEND kan leiden tot corrupte bestanden op NFS-bestandssystemen als meer dan één proces gegevens in één keer aan een bestand toevoegt. Dit komt omdat NFS geen ondersteuning biedt voor een bestand, dus de client-kernel moet het simuleren, wat niet mogelijk is zonder een race-situatie.

O_NONBLOCK ofMET VERTRAGING

Indien mogelijk wordt het bestand geopend in niet-blokkerende modus. Noch deOpen noch een volgende bewerking van de bestandsdescriptor die wordt geretourneerd, zorgt ervoor dat het aanroepproces wacht. Zie ook voor het gebruik van FIFO's (named pipes)fifo(4). Deze modus hoeft geen effect te hebben op andere bestanden dan FIFO's.

O_SYNC

Het bestand wordt geopend voor synchrone I / O. Iederschrijvens in de resulterende bestandsdescriptor blokkeert het aanroepproces totdat de gegevens fysiek naar de onderliggende hardware zijn geschreven. Zie BEPERKINGEN hieronder echter.

O_NOFOLLOW

Als pathname is een symbolische link, dan mislukt het openen. Dit is een FreeBSD-extensie, die in versie 2.1.126 aan Linux is toegevoegd. Symbolische links in eerdere componenten van de padnaam worden nog steeds gevolgd. De headers van glibc 2.0.100 en later bevatten een definitie van deze vlag; kernels vóór 2.1.126 negeren deze indien gebruikt .

O_DIRECTORY

Als pathname is geen map, want de opening mislukt. Deze vlag is Linux-specifiek en is toegevoegd in kernelversie 2.1.126, om denial-of-service-problemen te voorkomen alsopendir(3) wordt aangeroepen op een FIFO- of bandapparaat, maar mag niet worden gebruikt buiten de implementatie vanopendir.

O_DIRECT

Probeer cache-effecten van de I / O naar en van dit bestand te minimaliseren. Over het algemeen zal dit de prestaties verminderen, maar het is nuttig in speciale situaties, zoals wanneer applicaties hun eigen caching uitvoeren. Bestands-I / O wordt rechtstreeks naar / van gebruikersruimtebuffers uitgevoerd. De I / O is synchroon, d.w.z. aan het einde van de lezen(2) ofschrijven(2) systeemoproep, gegevens zijn gegarandeerd te zijn overgedragen. Overdrachtsgroottes en de uitlijning van gebruikersbuffer en bestandsoffset moeten alle veelvouden zijn van de logische blokgrootte van het bestandssysteem.Deze vlag wordt ondersteund op een aantal Unix-achtige systemen; ondersteuning is toegevoegd onder Linux in kernelversie 2.4.10.Een semantisch vergelijkbare interface voor blokapparaten wordt beschreven inrauw(8).

O_ASYNC

Genereer een signaal (standaard SIGIO, maar dit kan worden gewijzigd viafcntl(2)) wanneer invoer of uitvoer mogelijk wordt op deze bestandsdescriptor. Deze functie is alleen beschikbaar voor terminals, pseudo-terminals en sockets. Zienfcntl(2) voor meer informatie.

O_LARGEFILE

Op 32-bits systemen die het systeem met grote bestanden ondersteunen, staan ​​bestanden waarvan de grootten niet kunnen worden weergegeven in 31 bits, toe om te worden geopend.

Sommige van deze optionele vlaggen kunnen worden gewijzigd met behulp vanfcntl nadat het bestand is geopend.

Het argument mode geeft de machtigingen op die moeten worden gebruikt in het geval dat een nieuw bestand wordt gemaakt. Het wordt aangepast door het procesumask op de gebruikelijke manier: de rechten van het gemaakte bestand zijn(modus & ~ umask). Merk op dat deze modus alleen van toepassing is op toekomstige toegangen tot het nieuw gecreëerde bestand; deOpeneen aanroep die een alleen-lezen bestand creëert, kan heel goed een lees / schrijf-bestandsdescriptor retourneren.

De volgende symbolische constanten zijn voorzien mode :

S_IRWXU

00700 gebruiker (eigenaar van het bestand) heeft lees-, schrijf- en uitvoerrechten

S_IRUSR (S_IREAD)

00400 gebruiker heeft leestoestemming

S_IWUSR (S_IWRITE)

00200 gebruiker heeft schrijfrechten

S_IXUSR (S_IEXEC)

00100 gebruiker heeft execute permissie

S_IRWXG

00070-groep heeft lees-, schrijf- en uitvoerrechten

S_IRGRP

00040-groep heeft leestoestemming

S_IWGRP

00020 groep heeft schrijfrechten

S_IXGRP

00010-groep heeft uitvoervergunning

S_IRWXO

00007 anderen hebben lees-, schrijf- en uitvoerrechten

S_IROTH

00004 anderen hebben leesrechten

S_IWOTH

00002 anderen hebben schrijfrechten

S_IXOTH

00001 anderen hebben execute permissie

mode moet worden opgegeven wanneerO_CREAT is in de vlaggen , en wordt anders genegeerd.

creat is gelijk aanOpen met vlaggen gelijk aanO_CREAT | O_WRONLY | O_TRUNC.

WINSTWAARDE

Open encreat de nieuwe bestandsdescriptor retourneren, of -1 als er een fout is opgetreden (in welk geval errno is correct ingesteld). Let daar opOpen kan speciale apparaatbestanden openen, maarcreat kan ze niet maken - gebruikmknod(2) in plaats daarvan.

Op NFS-bestandssystemen met UID-toewijzing ingeschakeld,Open kan een bestandsdescriptor retourneren, maar bijvoorbeeld lezen(2) verzoeken worden geweigerd metEACCES. Dit komt omdat de client presteertOpen door de machtigingen te controleren, maar UID-toewijzing wordt uitgevoerd door de server bij lees- en schrijfverzoeken.

Als het bestand opnieuw is gemaakt, worden de velden atime, ctime en mtime op de huidige tijd ingesteld, net als de velden ctime en mtime in de bovenliggende map. Anders, als het bestand wordt gewijzigd vanwege de vlag O_TRUNC, worden de velden ctime en mtime ingesteld op de huidige tijd.

fouten

EEXIST

pathname bestaat al enO_CREAT enO_EXCL waren gebruikt.

EISDIR

pathname verwijst naar een map en de gevraagde toegang heeft betrekking op schrijven (dat wil zeggen,O_WRONLY ofO_RDWR is ingesteld).

EACCES

De gevraagde toegang tot het bestand is niet toegestaan, of een van de mappen in pathname toestemming voor zoeken (uitvoeren) niet toegestaan, of het bestand bestond nog niet en schrijftoegang tot de bovenliggende map is niet toegestaan.

ENAMETOOLONG

pathname was te lang.

ENOENT

O_CREAT is niet ingesteld en het benoemde bestand bestaat niet. Of, een mapcomponent in pathname bestaat niet of is een bungelende symbolische link.

ENOTDIR

Een component gebruikt als een directory in pathname is in feite geen map, ofO_DIRECTORYis opgegeven en pathname was geen map.

ENXIO

O_NONBLOCK | O_WRONLY is ingesteld, het benoemde bestand is een FIFO en er is geen proces om het bestand te lezen. Of het bestand is een speciaal apparaatbestand en er bestaat geen overeenkomstig apparaat.

ENODEV

pathname verwijst naar een speciaal apparaatbestand en er bestaat geen overeenkomstig apparaat. (Dit is een Linux kernelbug - in deze situatie moet ENXIO geretourneerd worden.)

EROFS

pathname verwijst naar een bestand op een alleen-lezen bestandssysteem en schrijftoegang is aangevraagd.

ETXTBSY

pathname verwijst naar een uitvoerbare afbeelding die momenteel wordt uitgevoerd en waarvoor schrijftoegang is aangevraagd.

EFAULT

pathname punten buiten uw toegankelijke adresruimte.

ELOOP

Er zijn te veel symbolische koppelingen gevonden bij het oplossen pathname ofO_NOFOLLOW was opgegeven maar pathname was een symbolische link.

ENOSPC

pathname moest worden gemaakt, maar het apparaat bevatte pathname heeft geen ruimte voor het nieuwe bestand.

ENOMEM

Onvoldoende kernelgeheugen was beschikbaar.

EMFILE

Het proces heeft al het maximale aantal bestanden geopend.

ENFILE

De limiet voor het totale aantal bestanden dat is geopend op het systeem is bereikt.

Voldoen aan

SVr4, SVID, POSIX, X / OPEN, BSD 4.3O_NOFOLLOW enO_DIRECTORY vlaggen zijn Linux-specifiek. Men moet misschien de_GNU_SOURCE macro om hun definities te krijgen.

beperkingen

Er zijn veel ongelukkigheden in het protocol dat ten grondslag ligt aan NFS en beïnvloedt onder andereO_SYNC enMET VERTRAGING.

POSIX biedt drie verschillende varianten van gesynchroniseerde I / O, die overeenkomen met de vlaggenO_SYNC , O_DSYNC en O_RSYNC. Momenteel (2.1.130) zijn dit allemaal synoniemen onder Linux.