fcntl
— Systemanropen fcntl
och ioctl
¶
Den här modulen utför fil- och I/O-kontroll på filbeskrivare. Den är ett gränssnitt till Unix-rutinerna fcntl()
och ioctl()
. Se Unix manualsidor fcntl(2) och ioctl(2) för fullständig information.
Tillgänglighet: Unix, not WASI.
Alla funktioner i denna modul tar en filbeskrivare fd som sitt första argument. Detta kan vara en heltalsfilbeskrivning, som den som returneras av sys.stdin.fileno()
, eller ett io.IOBase
-objekt, som sys.stdin
själv, som tillhandahåller en fileno()
som returnerar en äkta filbeskrivning.
Ändrad i version 3.3: Operationer i denna modul brukade ge upphov till ett IOError
, men nu ger de upphov till ett OSError
.
Ändrad i version 3.8: Modulen fcntl
innehåller nu konstanterna F_ADD_SEALS
, F_GET_SEALS
och F_SEAL_*
för försegling av os.memfd_create()
-filbeskrivare.
Ändrad i version 3.9: På macOS exponerar modulen fcntl
konstanten F_GETPATH
, som erhåller sökvägen till en fil från en filbeskrivare. På Linux (>=3.15) exponerar modulen fcntl
konstanterna F_OFD_GETLK
, F_OFD_SETLK
och F_OFD_SETLKW
, som används när man arbetar med öppna filbeskrivningslås.
Ändrad i version 3.10: På Linux >= 2.6.11, exponerar modulen fcntl
konstanterna F_GETPIPE_SZ
och F_SETPIPE_SZ
, som gör det möjligt att kontrollera respektive ändra en pipes storlek.
Ändrad i version 3.11: På FreeBSD exponerar fcntl
-modulen konstanterna F_DUP2FD
och F_DUP2FD_CLOEXEC
, som gör det möjligt att duplicera en filbeskrivare, den senare sätter dessutom flaggan FD_CLOEXEC
.
Ändrad i version 3.12: På Linux >= 4.5, exponerar fcntl
-modulen konstanterna FICLONE
och FICLONERANGE
, som gör det möjligt att dela vissa data i en fil med en annan fil genom att återlänka på vissa filsystem (t.ex. btrfs, OCFS2 och XFS). Detta beteende kallas vanligen ”copy-on-write”.
Ändrad i version 3.13: På Linux >= 2.6.32, exponerar fcntl
-modulen konstanterna F_GETOWN_EX
, F_SETOWN_EX
, F_OWNER_TID
, F_OWNER_PID
, F_OWNER_PGRP
, som gör det möjligt att rikta I/O-tillgänglighetssignaler till en specifik tråd, process eller processgrupp. På Linux >= 4.13 exponerar modulen fcntl
konstanterna F_GET_RW_HINT
, F_SET_RW_HINT
, F_GET_FILE_RW_HINT
, F_SET_FILE_RW_HINT
och RWH_WRITE_LIFE_*
, som gör det möjligt att informera kärnan om den relativa förväntade livslängden för skrivningar på en viss inode eller via en viss beskrivning av en öppen fil. På Linux >= 5.1 och NetBSD, exponerar modulen fcntl
konstanten F_SEAL_FUTURE_WRITE
för användning med F_ADD_SEALS
och F_GET_SEALS
operationer. På FreeBSD exponerar modulen fcntl
konstanterna F_READAHEAD
, F_ISUNIONSTACK
och F_KINFO
. På macOS och FreeBSD exponerar modulen fcntl
konstanten F_RDAHEAD
. På NetBSD och AIX exponerar modulen fcntl
konstanten F_CLOSEM
. På NetBSD exponerar modulen fcntl
konstanten F_MAXFD
. På macOS och NetBSD exponerar modulen fcntl
konstanterna F_GETNOSIGPIPE
och F_SETNOSIGPIPE
.
Ändrad i version 3.14: På Linux >= 6.1 exponerar modulen fcntl
modulen F_DUPFD_QUERY
för att fråga en filbeskrivare som pekar på samma fil.
Modulen definierar följande funktioner:
- fcntl.fcntl(fd, cmd, arg=0, /)¶
Utför operationen cmd på filbeskrivaren fd (filobjekt som tillhandahåller en
fileno()
-metod accepteras också). De värden som används för cmd är beroende av operativsystemet och finns tillgängliga som konstanter i modulenfcntl
, med samma namn som används i de relevanta C-headerfilerna. Argumentet arg kan antingen vara ett heltalsvärde, ett bytesliknande objekt eller en sträng. Typ och storlek på arg måste överensstämma med typ och storlek på argumentet för operationen enligt specifikationen i relevant C-dokumentation.När arg är ett heltal, returnerar funktionen heltalsreturvärdet för anropet C
fcntl()
.När argumentet är ett bytesliknande objekt representerar det en binär struktur, t.ex. skapad av
struct.pack()
. Ett strängvärde kodas till binär med hjälp av UTF-8-kodning. De binära data kopieras till en buffert vars adress skickas till Cfcntl()
-anropet. Returvärdet efter ett lyckat anrop är innehållet i bufferten, konverterat till ettbytes
-objekt. Längden på det returnerade objektet kommer att vara densamma som längden på argumentet arg. Detta är begränsat till 1024 byte.Om anropet av
fcntl()
misslyckas, genereras ettOSError
.Anteckning
Om typen eller storleken på arg inte stämmer överens med typen eller storleken på argumentet för operationen (t.ex. om ett heltal skickas när en pekare förväntas, eller om informationen som returneras i bufferten av operativsystemet är större än 1024 byte), är det mest troligt att detta resulterar i en segmenteringsöverträdelse eller en mer subtil datakorruption.
Utlöser en auditing event
fcntl.fcntl
med argumentenfd
,cmd
,arg
.Ändrad i version 3.14: Lägg till stöd för godtyckliga bytesliknande objekt, inte bara
bytes
.
- fcntl.ioctl(fd, request, arg=0, mutate_flag=True, /)¶
Denna funktion är identisk med funktionen
fcntl()
, förutom att argumenthanteringen är ännu mer komplicerad.Parametern request är begränsad till värden som kan rymmas i 32-bitar eller 64-bitar, beroende på plattform. Ytterligare konstanter av intresse för användning som request-argument finns i modulen
termios
, under samma namn som används i de relevanta C-headerfilerna.Parametern arg kan vara ett heltal, ett bytesliknande objekt eller en sträng. Typ och storlek på arg måste överensstämma med typ och storlek på argumentet för operationen enligt vad som anges i relevant C-dokumentation.
Om arg inte stöder gränssnittet för skriv-läs-buffert eller om mutate_flag är false, är beteendet detsamma som för funktionen
fcntl()
.Om arg stöder gränssnittet för skriv-läs-buffertar (som
bytearray
) och mutate_flag är true (standard), då skickas bufferten (i praktiken) till det underliggande systemanropetioctl()
, den senares returkod skickas tillbaka till den anropande Python, och buffertens nya innehåll återspeglar åtgärden frånioctl()
. Detta är en liten förenkling, för om den medföljande bufferten är mindre än 1024 byte lång kopieras den först till en statisk buffert som är 1024 byte lång, som sedan skickas tillioctl()
och kopieras tillbaka till den medföljande bufferten.Om anropet av
ioctl()
misslyckas, uppstår ett undantag av typenOSError
.Anteckning
Om typen eller storleken på arg inte stämmer överens med typen eller storleken på operationens argument (t.ex. om ett heltal skickas när en pekare förväntas, eller om informationen som returneras i bufferten av operativsystemet är större än 1024 byte, eller om storleken på det byte-liknande objektet är för liten), är det mest troligt att detta resulterar i en segmenteringsöverträdelse eller en mer subtil datakorruption.
Ett exempel:
>>> import array, fcntl, struct, termios, os >>> os.getpgrp() 13341 >>> struct.unpack('h', fcntl.ioctl(0, termios.TIOCGPGRP, " "))[0] 13341 >>> buf = array.array('h', [0]) >>> fcntl.ioctl(0, termios.TIOCGPGRP, buf, 1) 0 >>> buf array('h', [13341])
Utlöser en auditing event
fcntl.ioctl
med argumentenfd
,request
,arg
.Ändrad i version 3.14: GIL frigörs alltid under ett systemanrop. Systemanrop som misslyckas med EINTR försöker automatiskt på nytt.
- fcntl.flock(fd, operation, /)¶
Utför låsoperationen operation på filbeskrivaren fd (filobjekt som tillhandahåller en
fileno()
-metod accepteras också). Se Unix-manualen flock(2) för mer information. (På vissa system emuleras denna funktion med hjälp avfcntl()
)Om anropet av
flock()
misslyckas, uppstår ett undantag av typenOSError
.Utlöser en auditing event
fcntl.flock
med argumentenfd
,operation
.
- fcntl.lockf(fd, cmd, len=0, start=0, whence=0, /)¶
Detta är i huvudsak ett omslag runt
fcntl()
låsningsanrop. fd är filbeskrivaren (filobjekt som tillhandahåller enfileno()
-metod accepteras också) för den fil som ska låsas eller låsas upp, och cmd är ett av följande värden:- fcntl.LOCK_UN¶
Frigör ett befintligt lås.
- fcntl.LOCK_SH¶
Förvärva ett delat lås.
- fcntl.LOCK_EX¶
Förvärva ett exklusivt lås.
- fcntl.LOCK_NB¶
Bitvis OR med någon av de andra tre
LOCK_*
-konstanterna för att göra begäran icke-blockerande.
Om
LOCK_NB
används och låset inte kan förvärvas, kommer ettOSError
att uppstå och undantaget kommer att ha ett errno-attribut satt tillEACCES
ellerEAGAIN
(beroende på operativsystem; för portabilitet, kontrollera båda värdena). På åtminstone vissa system kanLOCK_EX
endast användas om filbeskrivaren hänvisar till en fil som är öppen för skrivning.len är antalet byte som ska låsas, start är den byteoffset som låset startar vid, relativt whence, och whence är som med
io.IOBase.seek()
, specifikt:0
– relativt till början av filen (os.SEEK_SET
)1
– relativt den aktuella buffertpositionen (os.SEEK_CUR
)2
– i förhållande till slutet av filen (os.SEEK_END
)
Standardvärdet för start är 0, vilket innebär att man börjar i början av filen. Standardvärdet för len är 0, vilket innebär att man låser till slutet av filen. Standardvärdet för whence är också 0.
Utlöser en auditing event
fcntl.lockf
med argumentenfd
,cmd
,len
,start
,whence
.
Exempel (alla på ett SVR4-kompatibelt system):
import struct, fcntl, os
f = open(...)
rv = fcntl.fcntl(f, fcntl.F_SETFL, os.O_NDELAY)
lockdata = struct.pack('hhllhh', fcntl.F_WRLCK, 0, 0, 0, 0, 0)
rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)
Observera att i det första exemplet kommer returvärdevariabeln rv att innehålla ett heltalsvärde; i det andra exemplet kommer den att innehålla ett bytes
-objekt. Strukturlayouten för variabeln lockdata är systemberoende — därför kan det vara bättre att använda flock()
-anropet.