Czym są deskryptory plików, wyjaśnione w prosty sposób?

  1. Jaki byłby bardziej uproszczony opis deskryptorów plików w porównaniu do Wikipedii? Dlaczego są one wymagane? Powiedzmy, weźmy za przykład procesy powłoki i jak się do nich stosuje?

  2. Czy tabela procesów zawiera więcej niż jeden deskryptor pliku. Jeśli tak, to dlaczego?

Author: Bhesh Gurung, 2011-03-10

10 answers

W prostych słowach, gdy otwierasz plik, system operacyjny tworzy wpis, który reprezentuje ten plik i przechowuje informacje o tym otwartym pliku. Więc jeśli w Twoim systemie operacyjnym jest 100 plików, to będzie 100 wpisów w systemie operacyjnym (gdzieś w jądrze). Te wpisy są reprezentowane przez liczby całkowite, takie jak (...100, 101, 102....). Ten numer wpisu jest deskryptorem pliku. Jest to więc tylko liczba całkowita, która jednoznacznie reprezentuje otwarty plik w systemie operacyjnym. Jeśli proces otworzy 10 plików wtedy twoja tabela procesów będzie miała 10 wpisów dla deskryptorów plików.

Podobnie, gdy otwierasz gniazdo sieciowe, jest ono również reprezentowane przez liczbę całkowitą i nazywa się je deskryptorem gniazda. Mam nadzieję, że rozumiesz.

 423
Author: Tayyab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-19 22:55:01

Deskryptor pliku jest nieprzezroczystym uchwytem, który jest używany w interfejsie między Użytkownikiem a przestrzenią jądra do identyfikacji zasobów plików / gniazd. Dlatego, gdy używasz open() LUB socket() (wywołania systemowe interfejsu do jądra), otrzymujesz deskryptor pliku, który jest liczbą całkowitą(jest to w rzeczywistości indeks do struktury procesów u - ale to nie jest ważne). Dlatego, jeśli chcesz połączyć się bezpośrednio z jądrem, używając wywołań systemowych do read(), write(), close() itd. uchwyt, którego używasz jest deskryptor pliku.

Na wywołaniach systemowych nakładana jest warstwa abstrakcji, którą jest interfejs stdio. Zapewnia to więcej funkcjonalności/funkcji niż podstawowe wywołania systemowe. Dla tego interfejsu, nieprzezroczysty uchwyt, który otrzymujesz, to FILE*, który jest zwracany przez wywołanie fopen(). Istnieje wiele wielu funkcji, które używają interfejsu stdio fprintf(), fscanf(), fclose(), które ułatwią Ci życie. W C, stdin, stdout, i stderrFILE*, które w Uniksie odpowiednio mapują do pliku deskryptory 0, 1 i 2.

 85
Author: Beano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-22 05:29:42

Usłysz to z paszczy konia: APUE (Richard Stevens).
Do jądra wszystkie otwarte pliki są określane przez deskryptory plików. Deskryptor pliku jest liczbą nieujemną.
gdy otwieramy istniejący plik lub tworzymy nowy plik, jądro zwraca procesowi deskryptor pliku. jądro utrzymuje tabelę wszystkich otwartych deskryptorów plików, które są w użyciu. Przydział deskryptorów plików jest zazwyczaj sekwencyjny i są one przypisywane do pliku jako następny wolny deskryptor pliku z puli wolnych deskryptorów plików. Gdy zamkniemy plik, deskryptor pliku zostanie uwolniony i będzie dostępny do dalszego przydziału.
Zobacz to zdjęcie, aby uzyskać więcej szczegółów :
Dwa Procesy

Gdy chcemy odczytać lub zapisać plik, identyfikujemy go za pomocą deskryptora pliku, który został zwrócony przez open() lub create() i używamy go jako argumentu do read() lub write().
Z Konwencji wynika, że UNIX Powłoki systemowe kojarzą deskryptor pliku 0 ze standardowym wejściem procesu, deskryptor pliku 1 ze standardowym wyjściem , a deskryptor pliku 2 ze standardowym błędem .
Deskryptor pliku waha się od 0 do OPEN_MAX.
Aby uzyskać więcej informacji, przejdź do trzeciego rozdziału książki APUE.

 78
Author: Shekhar Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-07 21:25:41

Jako dodatek do innych odpowiedzi, unix uważa wszystko za system plików. Klawiatura jest plikiem, który jest odczytywany tylko z perspektywy jądra. Ekran jest plikiem tylko do zapisu. Podobnie foldery, urządzenia wejścia-wyjścia itp. są również uważane za Pliki. Za każdym razem, gdy plik jest otwarty, powiedzmy, gdy sterowniki urządzeń [dla plików urządzeń] żądają open () lub proces otwiera plik użytkownika, jądro przydziela deskryptor pliku, liczbę całkowitą, która określa dostęp do tego pliku, np. tylko do odczytu, tylko do zapisu itp. [dla odniesienia: https://en.wikipedia.org/wiki/Everything_is_a_file ]

 13
Author: Balu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-24 03:58:37

Więcej punktów dotyczących File Descriptor:

  1. File Descriptors (FD) są nieujemnymi liczbami całkowitymi (0, 1, 2, ...), które są powiązane z otwartymi plikami.

  2. 0, 1, 2 są standardowe FD ' S, które odpowiadają STDIN_FILENO, STDOUT_FILENO i STDERR_FILENO (zdefiniowane w unistd.h) otwierane domyślnie w imieniu powłoki podczas uruchamiania programu.

  3. FD są przydzielane w kolejności sekwencyjnej, co oznacza najniższą możliwą nieprzydzieloną wartość całkowitą.

  4. FD dla a poszczególne procesy można zobaczyć w /proc/$pid/fd (w systemach opartych na Uniksie).

 11
Author: Sandeep_black,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-06 19:09:04

Każdy system operacyjny ma uruchomione procesy (p), powiedzmy p1, p2, p3 i tak dalej. Każdy proces zwykle stale korzysta z plików.

Każdy proces składa się z drzewa procesów (lub tabeli procesów, w innym frazowaniu).

Zazwyczaj systemy operacyjne reprezentują KAŻDY plik w każdym procesie przez Numer (to znaczy w każdym drzewie/tabeli procesów).

Pierwszy plik używany w procesie to file0 , drugi to file1 , trzeci jest file2 i tak dalej.

Każda taka liczba jest deskryptorem pliku.

Deskryptory plików są zwykle liczbami całkowitymi (0, 1, 2, a nie 0.5, 1.5, 2.5).

Biorąc pod uwagę, że często opisujemy procesy jako "tabele procesów", a biorąc pod uwagę, że tabele mają wiersze (wpisy), możemy powiedzieć, że komórka deskryptora pliku w każdym wpisie używa do reprezentowania całego wpisu.

W podobny sposób, gdy otwierasz gniazdo sieciowe, ma ono deskryptor gniazda.

W niektórych operacjach systemów, może zabraknąć deskryptorów plików, ale taki przypadek jest niezwykle rzadki i przeciętny użytkownik komputera nie powinien się tym martwić.

Deskryptory plików mogą być globalne (proces A zaczyna się od 0, a kończy się od 1 ; Proces B zaczyna się od 2, a kończy się od 3) i tak dalej, ale o ile wiem, zwykle w nowoczesnych systemach operacyjnych deskryptory plików nie są globalne i są w rzeczywistości specyficzne dla procesów (proces a zaczyna się od 0, a kończy się od 5, podczas gdy proces B zaczyna się od 0 i kończy się powiedzmy w 10).

 3
Author: JohnDoea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-21 04:17:39

Inne odpowiedzi dodały świetne rzeczy. Dodam tylko moje 2 centy.

Według Wikipedii wiemy na pewno: deskryptor pliku jest nieujemną liczbą całkowitą. Najważniejszą rzeczą, o której myślę, jest brak, byłoby powiedzieć:

Deskryptory plików są powiązane z identyfikatorem procesu.

Wiemy, że najbardziej znane deskryptory plików to 0, 1 i 2. 0 odpowiada STDIN, 1 do STDOUT i 2 do STDERR.

Powiedzmy, weźmy jako przykład procesy powłoki i jak to ubiegać się o to?

Zobacz ten kod

#>sleep 1000 &
[12] 14726

Stworzyliśmy proces o id 14726 (PID). Za pomocą lsof -p 14726 możemy uzyskać takie rzeczy:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sleep   14726 root  cwd    DIR    8,1     4096 1201140 /home/x
sleep   14726 root  rtd    DIR    8,1     4096       2 /
sleep   14726 root  txt    REG    8,1    35000  786587 /bin/sleep
sleep   14726 root  mem    REG    8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep   14726 root  mem    REG    8,1  2030544  137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep   14726 root  mem    REG    8,1   170960  137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep   14726 root    0u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    1u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    2u   CHR  136,6      0t0       9 /dev/pts/6

4-Ta kolumna FD i następny typ kolumny odpowiadają deskryptorowi pliku i typowi deskryptora pliku.

Niektóre wartości dla FD mogą być:

cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device

Ale prawdziwy deskryptor pliku znajduje się pod:

NUMBER – Represent the actual file descriptor. 

Znak po numerze tj. "1u", reprezentuje tryb w który plik jest otwarty. r dla odczytu, w dla zapisu, u dla odczytu i zapisu.

TYPE określa typ pliku. Niektóre wartości typów to:

REG – Regular File
DIR – Directory
FIFO – First In First Out

Ale wszystkie deskryptory plików są CHR-znakowy plik specjalny (lub znakowy plik urządzenia)

Teraz możemy zidentyfikować deskryptory plików dla STDIN, STDOUT i STDERR łatwo z lsof -p PID, lub możemy zobaczyć to samo, jeśli ls /proc/PID/fd.

Zauważ również, że tablica deskryptorów plików, którą śledzi jądro, nie jest taka sama jak tabela plików lub Tabela i-węzłów. Są one oddzielne, jak wyjaśniono niektóre inne odpowiedzi.

tabela fd

Możesz zadać sobie pytanie, gdzie fizycznie są te deskryptory plików i co jest przechowywane w /dev/pts/6 na przykład

sleep   14726 root    0u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    1u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    2u   CHR  136,6      0t0       9 /dev/pts/6

Cóż, /dev/pts/6 żyje wyłącznie w pamięci. Nie są to zwykłe pliki, ale tak zwane pliki urządzeń znakowych. Możesz to sprawdzić za pomocą: ls -l /dev/pts/6 i zaczną się od c, w moim przypadku crw--w----.

Żeby przypomnieć sobie większość Linuksów jak System operacyjny definiuje siedem typów plików:

  • zwykłe pliki
  • katalogi
  • pliki urządzeń znakowych
  • Blokuj pliki urządzeń
  • lokalne gniazda domenowe
  • nazwane rury (FIFOs) i
  • dowiązania symboliczne
 3
Author: prosti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-29 11:38:16

Deskryptory plików (FD) :

  • W Linux / Unix wszystko jest plikiem. Zwykły plik, katalogi, a nawet urządzenia to pliki. Każdy plik ma powiązany numer o nazwie deskryptor pliku (FD).
  • twój ekran ma również deskryptor pliku. Gdy program jest wykonywany wyjście jest wysyłane do deskryptora pliku ekranu, a Ty widzisz wyjście programu na monitorze. Jeśli wyjście jest wysyłane do pliku Deskryptor drukarki, wyjście programu miałoby been drukowane.

    Przekierowanie Błędu:
    Za każdym razem, gdy wykonujesz program/polecenie na terminalu, 3 pliki są zawsze otwarte
    1. standardowe wejście
    2. standardowe wyjście
    3. standardowy błąd.

    Pliki te są zawsze obecne, gdy program jest uruchomiony. Jak wyjaśniono przed deskryptorem pliku, jest powiązany z każdym z te pliki.
    Plik Deskryptor Pliku
    Standardowe wejście STDIN              0
    Standardowe wyjście STDOUT 1
    Błąd standardowy STDERR 2

  • na przykład, podczas wyszukiwania plików, jeden zazwyczaj otrzymuje odmowę uprawnień lub inne błędy. Błędy te można zapisać do określonego pliku.
    Przykład 1

$ LS mydir 2 > errorsfile.txt

Deskrypt pliku dla błędu standardowego to 2.
Jeśli nie ma żadnego katalogu o nazwie mydir to wyjście polecenia zostanie zapisany do pliku errorfile.txt
Używając "2>" przekierowujemy wyjście błędu do pliku o nazwie "errorfile.txt "
Tak więc wyjście programu nie jest zaśmiecone błędami.

mam nadzieję, że masz odpowiedź.

 2
Author: Abhishek Kamal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-02 17:48:54

Deskryptory plików

  • do jądra wszystkie otwarte pliki są określane przez deskryptory plików.
  • deskryptor pliku jest nieujemną liczbą całkowitą.
  • kiedy otwieramy istniejący lub tworzymy nowy plik, jądro zwraca deskryptor pliku procesowi.
  • gdy chcemy odczytywać lub zapisywać na pliku, identyfikujemy plik za pomocą deskryptora pliku, który został przekierowany przez open lub create, jako argument do odczytu lub zapisu.
  • każdy proces uniksowy ma 20 deskryptory plików i ich usuwanie, ponumerowane od 0 do 19, ale został rozszerzony do 63 przez wiele systemów.
  • Pierwsze trzy są już otwarte, gdy rozpoczyna się proces 0: standardowe wejście 1: standardowe wyjście 2: standardowe wyjście błędu
  • gdy proces rodzic rozwidla proces, proces potomny dziedziczy deskryptory plików rodzica
 1
Author: Mahendra suthar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-03 13:08:51

Deskryptory plików są deskryptorami do pliku. Dają linki do pliku. Z ich pomocą możemy odczytywać, zapisywać i otwierać plik.

 -5
Author: Motimahal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-18 03:43:05