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

Fájlleírók egyetlen folyamathoz, fájltábla és inode tábla. Ne feledje, hogy több fájlleíró hivatkozhat ugyanarra a fájltáblázat -bejegyzésre (pl. A dup rendszerhívás eredményeként, és hogy több fájltábla -bejegyzés is utalhat ugyanarra az inode -ra (ha többször megnyitották; a táblázat még mindig leegyszerűsített, mert fájlnévvel képviseli az inódokat, még akkor is, ha egy inode -nak több neve is lehet .) A 3. fájlleíró nem hivatkozik semmire a fájltáblában, jelezve, hogy bezárták.

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 atutó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 atutó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

Hivatkozások