Popisovač souboru - File descriptor

V počítačových operačních systémech Unix a Unix je deskriptor souborů ( FD , méně často fildes ) jedinečným identifikátorem ( popisovačem ) souboru nebo jiného vstupně/výstupního zdroje , například kanálu nebo síťové zásuvky .

Popisovače souborů mají obvykle nezáporné celočíselné hodnoty, přičemž záporné hodnoty jsou vyhrazeny pro označení „žádná hodnota“ nebo chybové podmínky.

Popisovače souborů jsou součástí POSIX API . Každý unixový proces (snad kromě démonů ) by měl mít tři standardní deskriptory souborů POSIX, které odpovídají třem standardním proudům :

Celočíselná hodnota název < unistd.h > symbolická konstanta < stdio.h > stream souborů
0 Standardní vstup STDIN_FILENO stdin
1 Standardní výstup STDOUT_FILENO standardní výstup
2 Standardní chyba STDERR_FILENO stderr

Přehled

Image
Popisovače souborů pro jeden proces, tabulka souborů a tabulka uzlů . Všimněte si, že více deskriptorů souborů může odkazovat na stejný záznam tabulky souborů (např. V důsledku duplicitního systémového volání a že více záznamů tabulky souborů může zase odkazovat na stejný inode (pokud byl otevřen vícekrát; tabulka je stále zjednodušené, protože reprezentuje inody názvy souborů, přestože inode může mít více jmen ). Popisovač souboru 3 neodkazuje na nic v tabulce souborů, což znamená, že byl uzavřen.

V tradiční implementaci Unixu se deskriptory souborů indexují do jednotlivých procesů tabulka deskriptorů souborů udržovaná jádrem, která se zase indexuje do celosystémové tabulky souborů otevřených všemi procesy, tzv.souborová tabulka . Tato tabulka zaznamenávárežim,ve kterém byl soubor (nebo jiný prostředek) otevřen: pro čtení, zápis, připojování a případně další režimy. Také se indexuje do třetí tabulky nazývanétabulka inodů,která popisuje skutečné podkladové soubory. Chcete -li provést vstup nebo výstup, proces předá deskriptor souboru jádru prostřednictvímsystémového volánía jádro přistoupí k souboru jménem procesu. Proces nemá přímý přístup k tabulkám souborů nebo inode.

V systému Linux lze k souboru popisovačů souborů otevřených v procesu přistupovat pod cestou /proc/PID/fd/, kde PID je identifikátor procesu .

V systémech podobných Unixu mohou deskriptory souborů odkazovat na jakýkoli typ souboru Unix pojmenovaný v systému souborů. Kromě běžných souborů sem patří adresáře , bloková a znaková zařízení (nazývaná také „speciální soubory“), sokety domény Unix a pojmenované kanály . Popisovače souborů mohou také odkazovat na jiné objekty, které normálně v systému souborů neexistují, například anonymní kanály a síťové zásuvky .

Datová struktura FILE v knihovně standardních I/O C obvykle obsahuje nízkoúrovňový deskriptor souboru pro předmětný objekt na unixových systémech. Celková datová struktura poskytuje další abstrakci a místo toho se označuje jako popisovač souboru .

Operace s deskriptory souborů

Následující seznam uvádí typické operace s popisovači souborů na moderních unixových systémech. Většina těchto funkcí je deklarována v <unistd.h>záhlaví, ale některé jsou místo toho v <fcntl.h>záhlaví.

Vytváření popisovačů souborů

  • otevřít ()
  • kreat ()
  • zásuvka()
  • přijmout()
  • zásuvka ()
  • trubka()
  • epoll_create () (Linux)
  • signalfd () (Linux)
  • eventfd () (Linux)
  • timerfd_create () (Linux)
  • memfd_create () (Linux)
  • userfaultfd () (Linux)
  • fanotify_init () (Linux)
  • inotify_init () (Linux)
  • clone () (s příznakem CLONE_PIDFD, Linux)
  • pidfd_open () (Linux)
  • open_by_handle_at () (Linux)

Odvození deskriptorů souborů

  • dirfd ()
  • Soubor č()

Operace na jednom deskriptoru souboru

  • číst (), psát ()
  • readv () , writeev ()
  • pread () , pwrite ()
  • recv () , send ()
  • recvfrom () , sendto ()
  • recvmsg () , sendmsg () (používá se také pro odesílání FD do jiných procesů přes soket domény Unix)
  • recvmmsg () , sendmmsg ()
  • lseek () , llseek ()
  • fstat ()
  • fstatvfs ()
  • fchmod ()
  • fchown ()
  • ftruncate ()
  • fsync ()
  • fdatasync ()
  • fdopendir ()
  • fgetxattr () , fsetxattr () (Linux)
  • flistxattr () , fremovexattr () (Linux)
  • statx (Linux)
  • setns (Linux)
  • vmsplice () (Linux)
  • pidfd_send_signal () (Linux)
  • waitid () (s typem ID P_PIDFD, Linux)
  • fdopen () (funkce stdio: převádí popisovač souboru na FILE*)
  • dprintf () (funkce stdio: tisk do deskriptoru souboru)

Operace na více deskriptorech souborů

  • vyberte () , pselect ()
  • poll () , ppoll ()
  • epoll_wait () , epoll_pwait () , epoll_pwait2 () (Linux, trvá jeden epoll souborový deskriptor čekat na mnoho dalších deskriptorů souborů)
  • epoll_ctl () (pro Linux)
  • kqueue () (pro systémy založené na BSD).
  • poslat soubor()
  • splice () , tee () (pro Linux)
  • copy_file_range () (pro Linux)
  • close_range () (pro Linux)

Operace s tabulkou deskriptoru souboru

Funkce fcntl () se používá k provádění různých operací s deskriptorem souboru v závislosti na argumentu příkazu, který mu byl předán. S deskriptorem souboru jsou spojeny příkazy pro získání a nastavení atributů, včetně F_GETFD, F_SETFD, F_GETFL a F_SETFL .

  • zavřít()
  • closefrom () (pouze BSD a Solaris; odstraní všechny popisovače souborů větší nebo rovné zadanému počtu)
  • dup () (duplikuje existující deskriptor souboru, který zaručuje, že je to nejnižší počet dostupných deskriptorů souborů)
  • dup2 () , dup3 () (v případě potřeby zavřete fd1a nastavte popisovač souboru fd1 tak, aby ukazoval na otevřený soubor fd2)
  • fcntl (F_DUPFD)

Operace, které mění stav procesu

  • fchdir () (nastaví aktuální pracovní adresář procesu na základě deskriptoru adresářového souboru)
  • mmap () (mapuje rozsahy souboru do adresního prostoru procesu)

Uzamčení souboru

  • stádo()
  • fcntl () (F_GETLK, F_SETLK a F_SETLKW)
  • lockf ()

Zásuvky

  • připojit()
  • svázat()
  • poslouchat()
  • accept () (vytvoří nový popisovač souboru pro příchozí připojení)
  • getsockname ()
  • getpeername ()
  • getsockopt ()
  • setsockopt ()
  • shutdown () (vypne jednu nebo obě poloviny plně duplexního připojení)

Smíšený

  • ioctl () (velká sbírka různých operací na jednom deskriptoru souboru, často spojená se zařízením)

Připravované operace

Řada nových operací se deskriptory souborů byla přidána do mnoha moderních unixových systémů a také do mnoha knihoven C, které mají být standardizovány v budoucí verzi POSIX . Tyto atpřípona znamená, že funkce má navíc první argument poskytující popisovač souboru, ze kterého relativní cesty jsou vyřešeny, formy postrádající atpříponu tak stává ekvivalentní průchodu popisovač souboru odpovídající aktuální pracovní adresář . Účelem těchto nových operací je obrana proti určité třídě útoků TOCTOU .

  • openat ()
  • faccessat ()
  • fchmodat ()
  • fchownat ()
  • fstatat ()
  • futimesat ()
  • linkat ()
  • mkdirat ()
  • mknodat ()
  • readlinkat ()
  • renameat ()
  • symlinkat ()
  • unlinkat ()
  • mkfifoat ()
  • fdopendir ()

Deskriptory souborů jako možnosti

Popisovače souborů Unix se chovají mnoha způsoby jako schopnosti . Mohou být předávány mezi procesy napříč sokety domény Unix pomocí sendmsg()systémového volání. Všimněte si však, že to, co je ve skutečnosti předáno, je odkaz na „popis otevřeného souboru“, který má proměnlivý stav (posun souboru a příznaky stavu souboru a přístupu). To komplikuje bezpečné používání deskriptorů souborů jako schopností, protože když programy sdílejí přístup ke stejnému otevřenému popisu souboru, mohou si navzájem překážet v jeho používání tím, že změní jeho offset nebo zda například blokuje nebo neblokuje. V operačních systémech, které jsou specificky navrženy jako systémy schopností, je velmi zřídka jakýkoli proměnlivý stav spojený se samotnou schopností.

Unix proces deskriptor souboru tabulka je příkladem C-seznamu .

Viz také

Reference