Fájlleíró - File descriptor
A Unix és Unix-szerű számítógépes operációs rendszerek, a fájl leíró ( FD , ritkábban Fildes ) egy egyedi azonosító ( fogantyú ) egy fájl vagy más input / output erőforrás , például egy cső vagy hálózati csatlakozó .
A fájlleírók általában nem negatív egész értékeket tartalmaznak, a negatív értékeket fenntartják, hogy jelezzék a "nincs érték" értéket vagy a hibát.
A fájlleírók a POSIX API részét képezik . Minden Unix folyamatnak (kivéve talán a démonokat ) három szabványos POSIX fájlleíróval kell rendelkeznie, amelyek megfelelnek a három szabványos adatfolyamnak :
Egész érték | Név | < unistd.h > szimbolikus állandó | < Stdio.h > file stream |
---|---|---|---|
0 | Standard bemenet | STDIN_FILENO | stdin |
1 | Standard kimenet | STDOUT_FILENO | stdout |
2 | Standard hiba | STDERR_FILENO | stderr |
Áttekintés
A Unix hagyományos megvalósításában a fájlleírók folyamatonként indexelnek a kernel által karbantartott fájlleíró tábla , amely viszont az összes folyamat által megnyitott, az egész folyamat által megnyitott fájlokat tartalmazó, egész rendszerre kiterjedő táblává indexel,fájltábla . Ez a táblázat rögzíti afájl (vagy más erőforrás) megnyitásánakmódját: olvasáshoz, íráshoz, hozzáfűzéshez és esetleg más módokhoz. Ezenkívül egy harmadik, azinode táblanevű táblába is indexel,amely leírja a tényleges mögöttes fájlokat. Elvégzésére bemeneti és kimeneti, a folyamat halad fájlleírót a kernel egyrendszer hívást, és a kernel elérhetik a fájlt nevében a folyamatot. A folyamat nem rendelkezik közvetlen hozzáféréssel a fájlokhoz vagy az inode táblákhoz.
A Linux , a készlet fájlleírókkal nyitott folyamat lehet hozzáférni az utat /proc/PID/fd/
, ahol a PID a folyamat azonosítója .
A Unix-szerű rendszerek fájlleírókkal utalhat bármilyen Unix fájltípus elemzi a fájlrendszerben. A szokásos fájlok mellett ide tartoznak a könyvtárak , a blokk- és karakterkészülékek (más néven "speciális fájlok"), a Unix domain -foglalatok és a megnevezett csövek . A fájlleírók utalhatnak más objektumokra is, amelyek általában nem léteznek a fájlrendszerben, például névtelen csövekre és hálózati aljzatokra .
A C szabványú I/O könyvtár FILE adatstruktúrája általában tartalmaz egy alacsony szintű fájlleírót a kérdéses objektumhoz Unix-szerű rendszereken. A teljes adatstruktúra további absztrakció és ehelyett ismert fájl fogantyú .
Műveletek a fájlleírókon
Az alábbiakban felsoroljuk a modern Unix-szerű rendszerek fájlleíróival kapcsolatos tipikus műveleteket . A legtöbb ilyen funkció a <unistd.h>
fejlécben van deklarálva , de néhány a <fcntl.h>
fejlécben található.
Fájlleírók létrehozása
- nyitva ()
- creat ()
- foglalat()
- elfogad()
- aljzatpár ()
- pipa()
- epoll_create () (Linux)
- signalfd () (Linux)
- eventfd () (Linux)
- timerfd_create () (Linux)
- memfd_create () (Linux)
- userfaultfd () (Linux)
- fanotify_init () (Linux)
- inotify_init () (Linux)
- clone () (CLONE_PIDFD jelzővel, Linux)
- pidfd_open () (Linux)
- open_by_handle_at () (Linux)
Fájlleírók származtatása
- dirfd ()
- fileno ()
Műveletek egyetlen fájlleírón
- olvasni (), írni ()
- readv () , writev ()
- pread () , pwrite ()
- recv () , küldés ()
- recvfrom () , sendto ()
- recvmsg () , sendmsg () (FD -k más folyamatokba küldéséhez is használható Unix tartomány socketen keresztül)
- 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 () (P_PIDFD azonosítótípussal, Linux)
- fdopen () ( stdio függvény: konvertálja a fájlleírót FILE* -vé )
- dprintf () ( stdio függvény: nyomtat a fájl leírójába )
Műveletek több fájlleírón
- select () , pselect ()
- poll () , ppoll ()
- epoll_wait () , epoll_pwait () , epoll_pwait2 () (Linux, egyetlen epoll -fájlleíró szükséges sok más fájlleíró kivárására )
- epoll_ctl () (Linux esetén)
- kqueue () (BSD-alapú rendszerekhez).
- sendfile ()
- splice () , tee () (Linux esetén)
- copy_file_range () (Linux esetén)
- close_range () (Linux esetén)
Műveletek a fájlleíró táblában
Az fcntl () függvény különböző műveletek végrehajtására szolgál a fájlleírón, attól függően, hogy a parancs argumentumot adta át neki. Vannak parancsok a fájlleíróhoz tartozó attribútumok beszerzésére és beállítására, beleértve az F_GETFD, F_SETFD, F_GETFL és F_SETFL fájlokat .
- Bezárás()
- closefrom () (csak BSD és Solaris; törli az összes fájlleírót, amely nagyobb vagy egyenlő a megadott számmal)
- dup () (megmásolja a meglévő fájlleírót, garantálva, hogy a rendelkezésre álló legalacsonyabb számú fájlleíró lesz)
- dup2 () , dup3 () (Ha szükséges, zárja be az fd1 parancsot, és állítsa az fd1 leírót az fd2 megnyitott fájljára)
- fcntl (F_DUPFD)
A folyamat állapotát módosító műveletek
- fchdir () (a folyamat aktuális munkakönyvtárát állítja be egy könyvtárfájl -leíró alapján)
- mmap () (a fájltartományokat leképezi a folyamat címterébe)
Fájlzárolás
- nyáj()
- fcntl () (F_GETLK, F_SETLK és F_SETLKW)
- lockf ()
Aljzatok
- csatlakozni ()
- köt ()
- hallgat()
- elfogad () (új fájlleírót hoz létre a bejövő kapcsolathoz)
- getockname ()
- getpeername ()
- getockopt ()
- setsockopt ()
- shutdown () (kikapcsolja a teljes duplex kapcsolat egyik vagy mindkét felét)
Vegyes
- ioctl () (különféle műveletek nagy gyűjteménye egyetlen fájlleírón, gyakran egy eszközhöz társítva)
Közelgő műveletek
A fájlleírókkal kapcsolatos új műveletek sorát számos modern Unix-szerű rendszer, valamint számos C könyvtár egészítette ki, amelyeket a POSIX jövőbeli verziójában szabványosítanak . Az at
utótag azt jelzi, hogy a függvény egy további első argumentumot vesz fel, amely egy fájlleírót ad, amelyből a relatív útvonalak feloldódnak, és az at
utótag nélküli formák így egyenértékűvé válnak az aktuális munkakönyvtárnak megfelelő fájlleíró átadásával . Ezen új műveletek célja a TOCTOU támadások egy bizonyos osztálya elleni védekezés.
- openat ()
- faccessat ()
- fchmodat ()
- fchownat ()
- fstatat ()
- futimesat ()
- linkat ()
- mkdirat ()
- mknodat ()
- readlinkat ()
- átnevezés ()
- symlinkat ()
- leválasztás ()
- mkfifoat ()
- fdopendir ()
A fájlleírók mint képességek
A Unix fájlleírók képességekként sokféleképpen viselkednek . A rendszerhívás segítségével átvihetők a folyamatok között a Unix tartomány aljzatai között sendmsg()
. Ne feledje azonban, hogy a ténylegesen átadott hivatkozás egy "nyitott fájlleírásra", amely megváltoztatható állapotú (a fájl eltolása, valamint a fájl állapota és a hozzáférési zászlók). Ez megnehezíti a fájlleírók biztonságos használatát képességekként, mivel amikor a programok ugyanazon nyílt fájlleíráshoz hozzáférnek, megoszthatják egymás használatát azzal, hogy megváltoztatják az eltolását, vagy hogy például blokkolja vagy nem blokkolja. A kifejezetten képességrendszerekként tervezett operációs rendszerekben nagyon ritkán fordul elő, hogy magához a képességhez bármilyen mutálható állapot társul.
A Unix folyamat fájlleíró táblázata egy példa a C-listára .
Lásd még
- beégető (Unix)
- lsof
- Fájlvezérlő blokk (FCB) - alternatív séma a C/PM és a DOS korai verzióiban