Deskriptor souboru - File descriptor
v Unix a příbuzný počítačové operační systémy, a deskriptor souboru (FD, méně často fildes) je abstraktní indikátor (Rukojeť ) slouží k přístupu a soubor nebo jiný vstup výstup zdroj, jako je a trubka nebo síťová zásuvka. Deskriptory souborů jsou součástí POSIX aplikační programovací rozhraní. Deskriptor souboru je nezáporný celé číslo, obecně zastoupené v C programovací jazyk jako typ int (záporné hodnoty jsou vyhrazeny pro označení „žádná hodnota“ nebo chybový stav).
Každý Unix proces (kromě snad a démon ) by měl očekávat, že bude mít tři standardní deskriptory souborů POSIX, odpovídající těmto třem standardní streamy:
Celočíselná hodnota | název | <unistd.h > symbolická konstanta[1] | <stdio.h > stream souborů[2] |
---|---|---|---|
0 | Standardní vstup | STDIN_FILENO | stdin |
1 | Standardní výstup | STDOUT_FILENO | stdout |
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é zase indexuje do celosystémové tabulky souborů otevřených všemi procesy, nazývané tabulka souborů. Tato tabulka zaznamenává režimu se kterým byl soubor (nebo jiný zdroj) otevřen: pro čtení, zápis, připojení a případně další režimy. Indexuje se také do třetí tabulky zvané tabulka inode který popisuje skutečné podkladové soubory.[3] Chcete-li provést vstup nebo výstup, proces předá deskriptor souboru jádru prostřednictvím a systémové volání a jádro k souboru přistoupí jménem procesu. Proces nemá přímý přístup k tabulkám souborů nebo inode.
Na Linux, k sadě deskriptorů souborů otevřených v procesu lze přistupovat pod cestou / proc / PID / fd /
, kde PID je identifikátor procesu.
v Unixový systémy, deskriptory souborů mohou odkazovat na jakékoli Unixový typ souboru pojmenovaný v systému souborů. Stejně jako běžné soubory to zahrnuje adresáře, blok a znaková zařízení (nazývané také „speciální soubory“), Unixové doménové zásuvky, a pojmenované trubky. Deskriptory souborů mohou také odkazovat na jiné objekty, které v systému souborů normálně neexistují, například anonymní kanály a síťové zásuvky.
Datová struktura SOUBOR v C standardní I / O knihovna obvykle obsahuje nízkoúrovňový deskriptor souboru pro daný objekt v systémech podobných Unixu. Celková datová struktura poskytuje další abstrakci a je místo toho známá jako soubor Rukojeť.
Operace s deskriptory souborů
Následující seznam uvádí typické operace s deskriptory souborů v moderních aplikacích Unixový systémy. Většina z těchto funkcí je deklarována v <unistd.h>
záhlaví, ale některé jsou v <fcntl.h>
místo toho záhlaví.
Vytváření deskriptorů souborů
- otevřeno ()
- kreativní ()[4]
- zásuvka()
- akceptovat()
- socketpair ()
- trubka()
- epoll_create () (Linux)
- signalfd () (Linux)
- eventfd () (Linux)
- timerfd_create () (Linux)
- memfd_create () (Linux)
- userfaultfd () (Linux)
- fanotify_init () (Linux)
- inotify_init () (Linux)
- klon () (s příznakem CLONE_PIDFD, Linux)
- pidfd_open () (Linux)
- open_by_handle_at () (Linux)
Odvození deskriptorů souborů
- dirfd ()
- Soubor č()
Operace s jediným deskriptorem souboru
- číst (), psát si ()
- readv (), writev ()
- pread (), pwrite ()
- recv (), poslat()
- recvfrom (), poslat komu()
- recvmsg (), sendmsg () (také se používá k 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)
- flistxatrr (), fremovexattr () (Linux)
- statx (Linux)
- setns (Linux)
- vmsplice () (Linux)
- pidfd_send_signal () (Linux)
- waitid () (s typem P_PIDFD ID, Linux)
- fdopen () (funkce stdio: převede deskriptor souboru na SOUBOR *)
- dprintf () (funkce stdio: tiskne do deskriptoru souboru)
Operace s více deskriptory souborů
- vybrat(), pselect ()
- hlasování(), ppoll ()
- epoll_wait (), epoll_pwait () (Linux, trvá jediný deskriptor epoll, aby čekal na mnoho dalších deskriptorů souborů)
- epoll_ctl () (pro Linux)
- kqueue () (pro systémy založené na BSD).
- poslat soubor()
- splice (), tričko () (pro Linux)
- copy_file_range () (pro Linux)
Operace s tabulkou deskriptorů souborů
The fcntl () Funkce se používá k provádění různých operací s deskriptorem souboru, v závislosti na předaném argumentu příkazu. Existují příkazy k získání a nastavení atributů přidružených k deskriptoru souboru, včetně F_GETFD, F_SETFD, F_GETFL a F_SETFL.
- zavřít()
- zblízka () (Pouze BSD a Solaris; odstraní všechny deskriptory souborů větší nebo rovné zadanému počtu)
- dup () (duplikuje existující deskriptor souboru, který zaručuje nejnižší dostupný počet deskriptorů souborů)
- dup2 (), dup3 () (Pokud je to nutné, zavřete fd1 a označte deskriptor 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 souboru adresáře)
- mmap () (mapuje rozsahy souboru do adresního prostoru procesu)
Zamykání souborů
- stádo()
- fcntl () (F_GETLK, F_SETLK a F_SETLKW)
- lockf ()
Zásuvky
- připojit()
- svázat()
- poslouchat()
- akceptovat() (vytvoří nový deskriptor souboru pro příchozí připojení)
- getsockname ()
- getpeername ()
- getsockopt ()
- setsockopt ()
- vypnout() (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)
Nadcházející operace
Byla přidána řada nových operací s deskriptory souborů do mnoha moderních unixových systémů, stejně jako do mnoha knihoven C, které mají být standardizovány v budoucí verzi POSIX.[5] The na
přípona znamená, že funkce přebírá další první argument poskytující deskriptor souboru, ze kterého relativní cesty jsou vyřešeny, chybí formy na
přípona se tak stává ekvivalentem předávání deskriptoru souboru odpovídajícího aktuálnímu pracovní adresář. Účelem těchto nových operací je obrana proti určité třídě TOCTOU útoky.
- openat ()
- Faccessat ()
- fchmodat ()
- fchownat ()
- fstatat ()
- futimesat ()
- linkat ()
- mkdirat ()
- mknodat ()
- readlinkat ()
- renameat ()
- symlinkat ()
- odpojit ()
- mkfifoat ()
- fdopendir ()
Deskriptory souborů jako funkce
Deskriptory souborů Unix se chovají mnoha způsoby jako schopnosti. Mohou být předávány mezi procesy napříč Unixové doménové zásuvky za použití sendmsg ()
systémové volání. Všimněte si však, že to, co je ve skutečnosti předáno, je odkaz na „otevřený popis souboru“, který má proměnlivý stav (offset souboru, stav souboru a příznaky přístupu). To komplikuje bezpečné používání deskriptorů souborů jako funkcí, protože když programy sdílejí přístup ke stejnému otevřenému popisu souboru, mohou navzájem ovlivňovat jeho použití změnou jeho offsetu nebo například tím, zda blokuje nebo neblokuje.[6][7] V operačních systémech, které jsou speciálně navrženy jako systémy schopností, existuje velmi zřídka jakýkoli proměnlivý stav spojený se schopností samotnou.
Příkladem a. Tabulky unixových deskriptorů souborů C-seznam.
Viz také
- fixační jednotka (Unix)
- také
- Blok řízení souborů (FCB) - alternativní schéma v C / PM a dřívějších verzích systému DOS
Reference
- ^ Otevřená skupina. „The Open Group Base Specification Issue 7, IEEE Std 1003.1-2008, 2016 Edition“. Citováno 2017-09-21.
- ^ Otevřená skupina. „The Open Group Base Specification Issue 7, IEEE Std 1003.1-2008, 2016 Edition“.
. Citováno 2017-09-21. CS1 maint: extra interpunkce (odkaz) - ^ A b Bach, Maurice J. (1986). Návrh operačního systému UNIX (8 ed.). Prentice-Hall. str.92–96. ISBN 9780132017992.
- ^ Otevřená skupina. „The Open Group Base Specification Issue 7, IEEE Std 1003.1-2008, 2018 Edition - kreativní“. Citováno 2019-04-11.
- ^ Rozšířená sada API, část 2. Otevřená skupina. Říjen 2006. ISBN 1931624674.
- ^ Brinkmann, Marcus (04.02.2009). „Stavba mostu: API knihovny a deskriptory souborů?“. cap-talk. Archivovány od originál dne 30. 7. 2012. Citováno 2017-09-21.
- ^ de Boyne Pollard, Jonathan (2007). „Nenastavujte deskriptory sdílených souborů na neblokující I / O režim“. Citováno 2017-09-21.