NAAM
fcntl − manipuleer bestandindicator
OVERZICHT
#include
<unistd.h>
#include <fcntl.h>
int
fcntl(int bi, int opd);
int fcntl(int bi, int opd,
long arg);
int fcntl(int bi, int opd,
struct flock * grendel);
BESCHRIJVING
fcntl voert 1 van verschillende opdrachten uit op bi. De betreffende opdracht wordt bepaald door opd:
F_DUPFD |
{kopieer bi} Vind de laagst genummerde beschikbare bestandindicator groter of gelijk aan arg en maak het een kopie van bi. Dit is een andere vorm van dup2(2) die {dup2} precies de bestandindicator die opgegeven wordt gebruikt. |
De oude en nieuwe beschrijvers mogen uitwisselbaar gebruikt worden. Ze delen grendels, bestand positie pointers en vlaggen; bijvoorbeeld: als de bestand positie veranderd wordt met lseek voor 1 van de beschrijvers dan is de positie ook veranderd voor de andere.
De twee beschrijvers delen echter niet de sluit-bij-uitvoering vlag. De sluit-bij-uitvoering vlag van de kopie is uit, wat betekend dat hij niet gesloten wordt bij uitvoering.
Bij success wordt de nieuwe beschrijver teruggegeven.
F_GETFD |
{krijg bi} Lees de sluit-bij-uitvoering vlag. Als het FD_CLOEXEC {sluit-bij-uitvoeren} bit 0 is, zal het bestand open blijven door een exec heen, anders zal het gesloten worden. | ||
F_SETFD |
{zet vlag} Zet de sluit-bij-uitvoering vlag naar de waarde bepaald door het FD_CLOEXEC bit van arg. | ||
F_GETFL |
{krijg vlaggen} Lees de beschrijvers vlaggen (alle vlaggen (zoals gezet door open(2)) worden teruggegeven). | ||
F_SETFL |
{zet vlaggen} Zet de beschrijvers vlaggen naar de waarde bepaald door arg. Alleen O_APPEND {toevoegen}, O_NONBLOCK {niet blokkeren} en O_ASYNC {niet-gelijktijdig} mogen gezet worden; de andere vlaggen blijven onaangeroerd. |
De vlaggen worden gedeeld door kopieen (gemaakt met dup(2), fork(2), enz.) van dezelfde bestandindicator.
De vlaggen en hun woordbetekenissen worden beschreven in open(2).
F_GETLK
{krijg grendel}, F_SETLK {zet grendel} en
F_SETLKW {zet grendel wacht} worden gebruikt om
in-overeenstemming-bestand-grendels te beheren. Het derde
argument lock is een pointer naar een "struct
flock" {structuur f grendel}. (die kan worden
overschreven door deze aanroep).
F_GETLK
{krijg grendel} Geef de "flock" structuur die ons weerhoudt van het krijgen van de grendel, of zet het l_type veld van de grendel naar F_UNLCK {open-grendel} als er geen beletsel is.
F_SETLK
{zet grendel} De grendel wordt gezet (als l_type, F_RDLCK {lees grendel} of F_WRLCK {schrijf grendel} is) of gewist (wanneer het F_UNLCK {open-slot} is). Als de grendel van iemand anders is, geeft deze aanroep -1 terug en zet errno naar EACCES {toegang} of EAGAIN {nogmaals}.
F_SETLKW
{zet grendel wacht} Net als F_SETLK, {zet grendel} maar in plaats van een fout teruggevend wachten we tot de grendel open gaat. Als een signaal dat afgevangen zal worden ontvangen wordt terwijl fcntl aan het wachten is, wordt het onderbroken en (nadat de signaal behandelaar terugkeerde) keert het onmiddellijk terug (met teruggave van waarde −1 en wordt errno gezet naar EINTR {onderbroken}).
F_GETOWN
{krijg eigen}, F_SETOWN {zet eigen}, F_GETSIG
{krijg signaal} en F_SETSIG {zet signaal} worden
gebruikt om In/Uit beschikbaarheids signalen te beheren:
F_GETOWN
{krijg eigen} Krijg het proces ID of proces groep, momenteel SIGIO en SIGURG ontvangend voor gebeurtenissen met de bestandindicator bi. Proces groepen worden teruggegeven als negatieve waardes.
F_SETOWN
{zet eigen} Zet het proces ID of de proces groep die de SIGIO en SIGURG signalen zal ontvangen voor gebeurtenissen met de bestandindicator bi. Proces groepen worden gegeven als negatieve waardes. (F_SETSIG {zet sign.} kan gebruikt worden om een ander signaal op te geven in plaats van SIGIO.)
Als je de O_ASYNC {niet-gelijktijdig} vlag op een bestandindicator zet (of door deze vlag met de open(2) aanroep te leveren, of met gebruik van de F_SETFL {zet vlaggen} opdracht van fcntl), dan zal een SIGIO signaal gezonden worden telkens wanneer invoer of uitvoer mogelijk wordt voor die bestandindicator.
Het proces of de proces groep die het signaal zal ontvangen kan gekozen worden met gebruik van de F_SETOWN opdracht van de fcntl functie. Als een bestandindicator een socket is, dan bepaald dit ook de ontvanger van SIGURG signalen die afgeleverd worden wanneer "out-of-band" {buiten band} gegevens aankomen op het socket. (SIGURG wordt gezonden en elke situatie waar select(2) zou rapporteren dat het socket in een aparte toestand verkeerd {"exceptional condition"}.)
Als de bestandindicator overeenkomt met een terminal {"terminal"} apparaat, dan worden SIGIO signalen naar de voorgrond proces groep van het terminal gezonden.
F_GETSIG
{krijg signaal} Krijg het signaal toegezonden wanneer invoer of uitvoer mogelijk wordt. Een waarde van nul betekend dat SIGIO gezonden wordt. Elke andere waarde (inclusief SIGIO) wordt in plaats daarvan het gezonden signaal, en in dit geval worden extra informatie beschikbaar voor de signaal behandelaar als die geïnstalleerd werd met SA_SIGINFO.
F_SETSIG
{zet signaal} Zet het verzonden signaal voor wanneer invoer of uitvoer mogelijk wordt. Een waarde van nul betekend het standaard {eng: default} SIGIO signaal. Elke andere waarde (inclusief SIGIO) wordt in plaats daarvan het verzonden signaal, en in dit geval worden extra informatie beschikbaar voor de signaal behandelaar als die geïnstalleerd werd met SA_SIGINFO.
Door F_SETSIG te gebruiken met een niet-nul waarde, en SA_SIGINFO voor de signaal behandelaar te zetten (zie sigaction(2)), worden extra informatie over In/Uit gebeurtenissen aan de behandelaar gegeven in een siginfo_t structuur. Als het si_code veld aangeeft dat de bron SI_SIGIO is, dan geeft het si_fd veld de bestandindicator die verbonden is met de gebeurtenis. Anders zijn er geen mogelijkheden om te achterhalen welke bestandindicators wachten, en moet je de gebruikelijke (select(2) {kies}, poll(2) {raadpleeg}, read(2) {lees} mechanismes gebruiken met O_NONBLOCK {niet blokkeer} gezet enz.) om te bepalen welke bestandindicators beschikbaar zijn voor In/Uit.
Door het kiezen van een POSIX.1b echte-tijd signaal (waarde >= SIGRTMIN) kunnen meerdere In/Uit gebeurtenissen in een wachtrij gezet worden met gebruik van dezelfde signaal nummers. (In-een-wachtrij-zetten is afhankelijk van het beschikbare geheugen). Extra informatie zijn voorhanden als SA_SIGINFO gezet is voor de signaal behandelaar, net als boven.
Gebruik makend van deze mechanismes kan een programma een volledig ongelijktijdige {"asynchronous"} In/Uit verwezijnlijken zonder meestal select(2) of poll(2) te gebruiken.
Het gebruik van O_ASYNC, F_GETOWN, F_SETOWN is eigen aan BSD en Linux. F_GETSIG en F_SETSIG zijn Linux-eigen. POSIX heeft ongelijktijdige In/Uit en de aio_sigevent structuur om soortgelijke dingen te bereiken; deze zijn ook voorhanden in Linux, als onderdeel van de GNU C bibliotheek (Glibc).
TERUGGEEF WAARDE
Bij een geslaagde aanroep hangt de terugkeer-waarde af van de operatie:
F_DUPFD |
De nieuwe beschrijver. | ||
F_GETFD |
Waarde van vlag. | ||
F_GETFL |
Waarde van vlaggen. | ||
F_GETOWN |
Waarde van beschrijver eigenaar. | ||
F_GETSIG |
Waarde van verzonden signaal wanneer lees of schrijf mogelijk wordt, of nul voor het traditionele SIGIO gedrag. |
Alle ander opdrachten
Nul.
Bij falen wordt −1 teruggegeven en errno wordt naar behoren gezet.
FOUTEN
EACCES |
{toegang} Opdracht wordt verboden door grendels van andere processen. | ||
EAGAIN |
{opnieuw} Opdracht wordt verboden omdat het bestand door een ander proces in geheugen-kaart {"memory-directorieped"} is gebracht. | ||
EBADF |
{slechte bi} bi is niet een open bestandindicator. | ||
EDEADLK |
{patstelling} Het werd bemerkt dat de opgegeven F_SETLKW opdracht een patstelling zou veroorzaken. | ||
EFAULT |
{fout} grendel ligt buiten door u toegankelijke adres ruimte. | ||
EINTR |
{onderbroken} Voor F_SETLKW, de opdracht werd onderbroken door een signaal. Voor F_GETLK en F_SETLK, de opdracht werd onderbroken door een signaal voordat de grendel werd getest of verkregen. Zeer waarschijnlijk tijdens het vergrendelen van een op-afstand {"remote"} bestand (grendelen over NFS), maar kan soms ook locaal {"local"} gebeuren. | ||
EINVAL |
{ongeldig} Voor F_DUPFD, arg is negatief of is groter dan de maximum toegestane waarde. Voor F_SETSIG, arg is niet een toegestaan signaal nummer. | ||
EMFILE |
{max bestand} Voor F_DUPFD, het proces heeft al het maximum aantal bestandindicators open. | ||
ENOLCK |
{geen grendel} Teveel segment grendels open, grendel tabel is vol, of een op-afstand protocol faalde (o.a. grendelen over NFS). | ||
EPERM |
{toestemming} Geprobeerd om de O_APPEND vlag te wissen op een bestand dat de alleen-toevoegen {"append-only"} eigenschap gezet heeft |
OPMERKINGEN
De fouten teruggegeven door dup2 zijn verschillend van die teruggegeven door F_DUPFD.
VOLDOET AAN
SVr4, SVID, POSIX, X/OPEN, BSD 4.3. Alleen de opdrachten F_DUPFD, F_GETFD, F_SETFD, F_GETFL, F_SETFL, F_GETLK, F_SETLK en F_SETLKW worden opgegeven door POSIX.1. F_GETOWN en F_SETOWN zijn BSD-ismes, niet ondersteund in SVr4; F_GETSIG en F_SETSIG zijn eigen aan Linux. De vlaggen legaal voor F_GETFL/F_SETFL zijn die, ondersteund door open(2) en ze wisselen tussen deze systemen; O_APPEND, O_NONBLOCK, O_RDONLY, en O_RDWR worden opgegeven door POSIX.1. SVr4 ondersteund verschillende andere keuzes en vlaggen niet hier beschreven.
SVr4 beschrijft extra EIO, ENOLINK en EOVERFLOW fouttoestanden.
ZIE
dup2(2) {verdubbel}, flock(2) {vergrendel}, open(2) {open}, socket(2)
VERTALING
Dit is een handleiding uit manpages-dev 1.29.
Alles wat tussen ’{’..’}’ staat is aanvullende vertaling, en hoort niet bij de originele handleiding. Email naar <manpages-nl [AT] nl.org>.
$Id: fcntl.2,v 1.1.1.1 2004/03/21 21:02:25 cor Exp $