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
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é
- fixační jednotka (Unix)
- lsof
- File Control Block (FCB) - alternativní schéma v C/PM a dřívějších verzích DOS