NAAM
open, creat − openen (en mogelijk maken) van een bestand of apparaat
OVERZICHT
#include
<sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int
open(const char *padnaam, int
vlaggen);
int open(const char *padnaam, int
vlaggen, mode_t mode);
int creat(const char *padnaam, mode_t
mode);
BESCHRIJVING
De open() systeem aanroep wordt gebruikt om een padnaam om te zetten in een bestandindicator (een klein, niet negatief geheel getal, dat gebruikt kan worden in In/Uit zoals met read(2), write(2), enz.). Wanneer de aanroep slaagt, wordt de bestandindicator teruggegeven met het laagste nummer dat niet door het proces wordt gebruikt op dat moment. Deze aanroep maakt een bestand open dat niet gedeeld wordt met andere processen. (Maar gedeelde open bestanden kunnen ontstaan door de fork(2) systeem aanroep.) Voor de nieuwe bestandindicator staat ’aan’ dat hij open blijft dóór exec* functies heen. (zie fcntl(2)) De bestand-positie wordt naar het begin van het bestand gezet.
vlaggen Kan ’O_RDONLY’, ’O_WRONLY’ of ’O_RDWR’ zijn, respectievelijk: open het bestand voor alleen-lezen, alleen-schrijven of lezen-én-schrijven.
vlaggen
Mag ook een bitsgewijze of zijn van één
of meer van het volgende:
O_CREAT
{maak} Als een bestand met dezelfde naam nog niet bestaat, dan wordt het gemaakt.
O_EXCL |
{uitsluiten} Wanneer gebruikt met O_CREAT en als het bestand al bestaat is de aanroep fout en zal open() falen. O_EXCL Is gebroken op NFS bestandsystemen; programma’s die op O_EXCL vertrouwen om bestandvergrendelings-opdrachten uit te voeren bevatten een wedstrijd mogelijkheid. De oplossing voor het uitvoeren van ’atomische’ bestandvergrendelingen met gebruik van een slot-bestand is het maken van een uniek bestand in hetzelfde bestandsysteem (met machinenaam en pid), gebruik link(2) om een koppeling te maken met het slotbestand. Als link() 0 teruggeeft is het slot gelukt. Gebruik anders stat(2) op het unieke bestand om te controleren of het koppelingen aantal van het bestand toegenomen is naar 2, in welk geval het slot ook geslaagd is. |
O_NOCTTY
{geen controlerende tty} Als padnaam naar een terminal apparaat wijst — zie tty(4) — dan zal het niet de controlerende terminal van het proces worden, ook al heeft het proces geen controlerende terminal.
O_TRUNC
{afhakken} Als het bestand al bestaat wordt het afgehakt (naar lengte nul).
O_APPEND
{toevoegen} Het bestand is geopend in toevoegen-modus. Vóór elke write(), wordt de positie in het bestand einde-van-bestand, alsof lseek gebruikt was. O_APPEND Kan leiden tot verpeste bestanden op NFS bestandsystemen als meer dan één proces tegelijk gegevens aan het einde toevoegt. Dat is omdat NFS toevoegen-aan-het-einde niet ondersteund, de cliënt kernel moet dus ’alsof’ doen maar dat is onmogelijk zonder een wedstrijd- mogelijkheid.
O_NONBLOCK of O_NDELAY
{niet blokkeren} {geen vertraging} Het bestand wordt geopend in niet-blokkerende mode. open() En andere daaropvolgende operaties op de bestandindicator die teruggegeven wordt, zullen het proces niet blokkeren. Voor hoe FIFO’s (pijpen met namen) behandeld worden, zie ook fifo(4).
O_SYNC |
{gelijktijdig} Het bestand is geopend voor onmiddellijke In/Uit. Elke write() naar de opgeleverde bestandindicator zal het aanroepende proces blokkeren, totdat de gegevens (materieel) naar de onderliggende hardware zijn geschreven. Maar zie BEPERKINGEN onder |
O_NOFOLLOW
{niet volgen} Als padnaam een symbolische koppeling is dan faalt de open. Symbolische koppelingen in eerdere delen van de padnaam worden nog steeds gevolgd.
Dit is een FreeBSD uitbreiding, die aan Linux werd toegevoegd in versie 2.1.126. De ’headers’ van glibc 2.0.100 en later definiëren deze vlag; kernel’s van voor 2.1.126 negeren deze vlag.
O_DIRECTORY
{directorie} Als padnaam geen directorie is dan faalt open. Deze vlag is eigen aan Linux, en werd toegevoegd in kernel versie 2.1.126 om deny-of-service {negeren van diensten} problemen te omzeilen als opendir(3) wordt aangeroepen op een FIFO of een tape-apparaat. Deze vlag zou niet gebruikt moeten worden buiten het bouwen van opendir.
O_LARGEFILE
{groot bestand} Op 32-bit systemen die grote bestandsystemen {eng: LFS} ondersteunen, staat dit toe om bestanden met een langere lengte dan in 32-bits uitgedrukt kan worden, toch te openen. De Linux kernel ondersteund dit nu nog niet (nu 2.1.130), maar de vlaggen definities zijn present en de gebruikersruimte LFS-interfaces zijn aanwezig in de glibc 2.1 test uitgave.
Sommige van deze niet-verplichte vlaggen kunnen veranderd worden met fcntl nadat het bestand is geopend.
mode Bepaald de toestemmingen die worden gebruikt als een bestand wordt gemaakt. Dit wordt veranderd door het umask {nl: gebruikers-stempel/masker} van het proces op de gebruikelijke manier: de toestemmingen van het gemaakte bestand worden (mode & ~umask).
In de volgende
symbolische constanten is voorzien voor mode:
S_IRWXU
00700 gebruiker (bestand eigenaar) heeft lees, schrijf en uitvoer toestemming
S_IRUSR (S_IREAD)
00400 gebruiker heeft lees toestemming
S_IWUSR (S_IWRITE)
00200 gebruiker heeft schrijf toestemming
S_IXUSR (S_IEXEC)
00100 gebruiker heeft uitvoer toestemming
S_IRWXG
00070 groep heeft lees, schrijf en uitvoer toestemming
S_IRGRP
00040 groep heeft lees toestemming
S_IWGRP
00020 groep heeft schrijf toestemming
S_IXGRP
00010 groep heeft uitvoer toestemming
S_IRWXO
00007 anderen hebben lees, schrijf en uitvoer toestemming
S_IROTH
00004 anderen hebben lees toestemming
S_IWOTH
00002 anderen hebben schrijf toestemming
S_IXOTH
00001 anderen hebben uitvoer toestemming
mode Moet altijd gegeven worden wanneer O_CREAT in de vlaggen, zit. Als O_CREAT niet in de vlaggen zit wordt mode genegeerd.
creat() Is hetzelfde als open met vlaggen gelijk aan O_CREAT|O_WRONLF|O_TRUNC.
EIND WAARDE
open En creat geven de nieuwe bestandindicator terug, of −1 als er een fout was (en welk geval errno naar behoren wordt gezet). Merk op dat open apparaat speciale bestanden kan openen, maar creat kan ze niet maken - gebruik in plaats daarvan mknod(2).
Op NFS bestand systemen waar UID ’mapping’ {nl: in kaart brengen} aan staat, geeft open een bestandindicator terug, maar read(2) aanvragen worden niet toegestaan, en falen met EACCES. Dit is omdat de cliënt de open doet door de toestemmingen te controleren, maar het UID ’mappen’ wordt door de server gedaan bij lees en schrijf aanvragen.
FOUTEN
EEXIST |
{bestaat} padnaam Bestaat al en O_CREAT en O_EXCL werden gebruikt. | ||
EISDIR |
{is directorie} padnaam Wijst naar een directorie en de toegang tot het bestand betekende o.a. schrijf-toegang. | ||
EACCES |
{toegang} De gevraagde toegang tot het bestand werd niet toegestaan, òf één van de directories in padnaam had geen zoek (uitvoer) toestemming, òf het bestand bestond nog niet en schrijf toegang in de ouder-directorie werd niet toegestaan. |
ENAMETOOLONG
{naam te lang} padnaam was te lang.
ENOENT |
{geen ingang} Een directorie deel van padnaam bestaat niet of is een loshangende symbolische koppeling. |
ENOTDIR
{geen dir} Een deel gebruikt als directorie in padnaam is in feite geen directorie, of O_DIRECTORY werd gebruikt maar padnaam was geen directorie.
ENXIO |
{geen apparaat of adres} O_NONBLOCK | O_WRONLY is gezet en het genoemde bestand is een FIFO maar er is geen proces dat de FIFO open heeft om te lezen, of het bestand is een apparaat speciaal bestand maar er is geen bijbehorend apparaat. | ||
ENODEV |
{geen apparaat} padnaam Wijst naar een apparaat speciaal bestand maar er is geen bijbehorend apparaat. (Dit is een Linux kernel bug - in deze situatie moet ENXIO worden teruggegeven.) | ||
EROFS |
{alleen-lezen bestandsysteem} padnaam Wijst naar een bestand op een alleen-lezen bestandsysteem en schrijf toegang werd gevraagd. |
ETXTBSY
{text bezig} padnaam Wijst naar een uitvoerbaar bestand dat momenteel wordt uitgevoerd en schrijf toegang werd gevraagd.
EFAULT |
{fout} padnaam Wijst buiten door u toegankelijke adres ruimte. | ||
ELOOP |
{cirkel} Er werden teveel symbolische koppelingen tegengekomen bij het oplossen van padnaam, of O_NOFOLLOW werd gebruikt, maar padnaam was een symbolische koppeling. | ||
ENOSPC |
{geen ruimte} padnaam Zou gemaakt worden, maar het apparaat dat padnaam zou gaan bevatten heeft geen ruimte voor een nieuw bestand. | ||
ENOMEM |
{geen geheugen} Onvoldoende kernel geheugen voorhanden. | ||
EMFILE |
{maximum bestanden} Het proces heeft al het maximale aantal bestanden open. | ||
ENFILE |
{aantal bestanden} De grens aan het totale aantal open bestanden op het systeem is bereikt. |
VOLDOET AAN
SVr4, SVID, POSIX, X/OPEN, BSD 4.3
BEPERKINGEN
Er zijn vele ongelukkigheden in het protocol waar NFS op gebaseerd is, die onder anderen O_SYNC en O_NDELAY nadelig beïnvloeden.
POSIX voorziet in drie verschillende soorten van onmiddellijke In/Uit, die bij de O_SYNC, O_DSYNC en O_RSYNC horen. Momenteel (2.1.130) zijn deze allemaal gelijk onder Linux.
ZIE
read(2) {lees}, write(2) {schrijf}, fcntl(2) {manipuleer bi}, close(2) {sluit, link(2) {verbind}, mknod(2) {maak node}, mount(2) {mount}, stat(2) {staat}, umask(2) {gebruikers stempel}, unlink(2) {maak los}, socket(2),{socket} fopen(3) {openen}, fifo(4) {eerst in, eerst uit}
VERTALING
Dit is een handleiding uit manpages-dev 1.34. Alles wat tussen ’{’..’}’ staat is aanvullende vertaling, en hoort niet bij de originele handleiding. Email naar <manpages-nl [AT] nl.org>.
$Id: open.2,v 1.2 2005/01/31 09:47:28 wouter Exp $