Czym są deskryptory plików, wyjaśnione w prosty sposób?
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?
Czy tabela procesów zawiera więcej niż jeden deskryptor pliku. Jeśli tak, to dlaczego?
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.
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 stderr
są FILE*
, które w Uniksie odpowiednio mapują do pliku deskryptory 0
, 1
i 2
.
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 :
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.
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 ]
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
:
File Descriptors
(FD) są nieujemnymi liczbami całkowitymi(0, 1, 2, ...)
, które są powiązane z otwartymi plikami.0, 1, 2
są standardowe FD ' S, które odpowiadająSTDIN_FILENO
,STDOUT_FILENO
iSTDERR_FILENO
(zdefiniowane wunistd.h
) otwierane domyślnie w imieniu powłoki podczas uruchamiania programu.FD są przydzielane w kolejności sekwencyjnej, co oznacza najniższą możliwą nieprzydzieloną wartość całkowitą.
FD dla a poszczególne procesy można zobaczyć w
/proc/$pid/fd
(w systemach opartych na Uniksie).
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).
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.
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
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- standardowe wejście
- standardowe wyjście
- 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ź.
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
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.
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