Jaki byłby bardziej uproszczony opis deskryptorów plików w porównaniu do Wikipedii? Dlaczego są wymagane? Powiedzmy, weźmy procesy powłoki jako przykład i jak się do tego stosuje?
Czy tabela procesów zawiera więcej niż jeden deskryptor pliku. Jeśli tak, dlaczego?
unix
operating-system
file-descriptor
Nishant
źródło
źródło
Odpowiedzi:
Krótko mówiąc, po otwarciu pliku system operacyjny tworzy wpis reprezentujący ten plik i przechowujący informacje o tym otwartym pliku. Więc jeśli w twoim systemie jest otwartych 100 plików, w systemie będzie 100 wpisów (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 liczba całkowita, która jednoznacznie reprezentuje otwarty plik w systemie operacyjnym. Jeśli twój proces otworzy 10 plików, twoja tabela procesów będzie miała 10 pozycji dla deskryptorów plików.
Podobnie, gdy otwierasz gniazdo sieciowe, jest ono również reprezentowane przez liczbę całkowitą i nazywa się Script Descriptor. Mam nadzieję że rozumiesz.
źródło
/proc
cały czas otwierają deskryptory .open()
da deskryptor pliku 3, nawet jeśli inny uruchomiony proces ma deskryptor pliku 3. Zobacz definicję POSIXopen()
: „Funkcja open () zwróci deskryptor pliku dla nazwanego pliku, który jest najniższy deskryptor pliku nie jest obecnie otwarty dla tego procesu . ” (podkreślenie dodane).Deskryptor pliku jest nieprzezroczystym uchwytem używanym w interfejsie między przestrzenią użytkownika a jądrem do identyfikowania zasobów plików / gniazd. Dlatego, kiedy używasz
open()
lubsocket()
(systemowe wywołania interfejsu do jądra), dostajesz deskryptor pliku, który jest liczbą całkowitą (jest to faktycznie indeks struktury procesów - ale to nie jest ważne). Dlatego, jeśli chcesz współpracować bezpośrednio z jądra, używając wywołań systemowychread()
,write()
,close()
itp uchwyt używasz jest deskryptor pliku.Na wywołania systemowe nakładana jest warstwa abstrakcji, którą jest
stdio
interfejs. Zapewnia to więcej funkcji / funkcji niż podstawowe wywołania systemowe. W przypadku tego interfejsu nieprzezroczysty uchwyt, który otrzymujeszFILE*
, jest zwracany przezfopen()
wywołanie. Istnieje wiele wiele funkcji, które korzystają zstdio
interfejsufprintf()
,fscanf()
,fclose()
, które są tam, aby ułatwić Ci życie. W Cstdin
,stdout
istderr
toFILE*
, co w systemie UNIX odpowiednio mapować do deskryptorów plików0
,1
a2
.źródło
Posłuchaj go z Horse's Mouth: APUE (Richard Stevens).
Do jądra wszystkie otwarte pliki są przywoływane przez deskryptory plików. Deskryptor pliku jest liczbą nieujemną.
Kiedy otwieramy istniejący plik lub tworzymy nowy, jądro zwraca deskryptor pliku do procesu. Jądro utrzymuje tabelę wszystkich używanych deskryptorów otwartych plików. Przydział deskryptorów plików jest zasadniczo sekwencyjny i są one przydzielane do pliku jako następny wolny deskryptor pliku z puli wolnych deskryptorów plików. Kiedy zamykamy plik, deskryptor pliku zostaje zwolniony i jest dostępny do dalszego przydziału.
Zobacz ten obraz, aby uzyskać więcej informacji:
Kiedy chcemy odczytać lub zapisać plik, identyfikujemy plik za pomocą deskryptora pliku, który został zwrócony przez wywołanie funkcji open () lub create () , i używamy go jako argumentu funkcji read () lub write () .
Zasadniczo powłoki systemu UNIX kojarzą deskryptor pliku 0 ze standardowym wejściem procesu, deskryptor pliku 1 ze standardowym wyjściem , a deskryptor pliku 2 ze standardowym błędem .
Zakres deskryptorów plików wynosi od 0 do OPEN_MAX. Maksymalną wartość deskryptora pliku można uzyskać za pomocą
ulimit -n
. Aby uzyskać więcej informacji, przejdź do trzeciego rozdziału książki APUE.źródło
osqueryi <<< echo '.all process_open_files'
w powłoce bash.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ą, którą moim zdaniem brakuje, byłoby powiedzenie:
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 doSTDOUT
i 2 doSTDERR
.Sprawdź ten kod
Stworzyliśmy proces o identyfikatorze 14726 (PID). Używając
lsof -p 14726
możemy uzyskać takie rzeczy:Czwarta kolumna FD i następna kolumna TYPE odpowiadają deskryptorowi pliku i typowi deskryptora pliku.
Niektóre wartości FD mogą być:
Ale prawdziwy deskryptor pliku znajduje się w:
Znak po liczbie, tj. „1u”, oznacza tryb, w którym plik jest otwierany. r do odczytu, w do zapisu, u do odczytu i zapisu.
TYPE określa typ pliku. Niektóre wartości TYPE to:
Ale wszystkie deskryptory plików to CHR - znak specjalny plik (lub plik urządzenia znakowego)
Teraz możemy zidentyfikować deskryptorów dla
STDIN
,STDOUT
iSTDERR
łatwelsof -p PID
, czy widzimy to samo, gdybyśmyls /proc/PID/fd
.Zauważ też, ż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ą to osobne, jak wyjaśniono niektóre inne odpowiedzi.
Można zadać sobie pytanie, gdzie są te deskryptory plików fizycznie i to, co jest zapisane w
/dev/pts/6
na przykładCóż,
/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ą odc
, w moim przypadkucrw--w----
.Aby przypomnieć sobie większość systemów operacyjnych typu Linux, zdefiniuj siedem rodzajów plików:
źródło
Więcej punktów dotyczących
File Descriptor
:File Descriptors
(FD) to nieujemne liczby całkowite(0, 1, 2, ...)
powiązane z otwieranymi plikami.0, 1, 2
są standardowe FD „s, która odpowiadaSTDIN_FILENO
,STDOUT_FILENO
iSTDERR_FILENO
(zdefiniowane wunistd.h
) domyślnie otwierane w imieniu skorupy podczas uruchamiania programu.FD są przydzielane w kolejności sekwencyjnej, co oznacza najniższą możliwą nieprzydzieloną wartość całkowitą.
FD dla konkretnego procesu można zobaczyć w
/proc/$pid/fd
(w systemach opartych na Uniksie).źródło
Jako uzupełnienie innych odpowiedzi, unix traktuje wszystko jako system plików. Twoja klawiatura jest plikiem, który jest czytany 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 otwierany, powiedzmy, gdy sterowniki urządzeń [dla plików urządzeń] żądają otwarcia () lub gdy proces otwiera plik użytkownika, jądro przydziela deskryptor pliku, liczbę całkowitą, która określa dostęp do tego pliku, tak że jest on tylko do odczytu , pisz tylko itd. [dla odniesienia: https://en.wikipedia.org/wiki/Everything_is_a_file ]
źródło
Deskryptory plików (FD):
Błąd przekierowania:
Za każdym razem, gdy wykonujesz program / polecenie na terminalu, 3 pliki są zawsze otwarte
Pliki te są zawsze obecne przy każdym uruchomieniu programu. Jak wyjaśniono przed deskryptorem pliku, jest on powiązany z każdym z tych plików.
Plik Deskryptor pliku
Standardowe wejście STDIN 0
Standardowe wyjście STDOUT 1
Standardowy błąd STDERR 2
Przykład 1
Deskryptorem pliku dla standardowego błędu jest 2.
Jeśli nie ma katalogu o nazwie mydir, dane wyjściowe polecenia zostaną zapisane w pliku errorfile.txt
Za pomocą „2>” przekierowujemy wyjście błędu do pliku o nazwie „errorfile”. txt "
W ten sposób wyniki programu nie są zaśmiecone błędami.
Mam nadzieję, że dostałeś swoją odpowiedź.
źródło
Każdy system operacyjny ma uruchomione procesy (p), powiedzmy p1, p2, p3 i tak dalej. Każdy proces zwykle stale wykorzystuje pliki.
Każdy proces składa się z drzewa procesów (lub tabeli procesów, w innym sformułowaniu).
Zwykle systemy operacyjne reprezentują każdy plik w każdym procesie przez liczbę (to znaczy w każdym drzewie / tabeli procesu).
Pierwszy plik użyty w tym procesie to plik0 , drugi to plik1 , trzeci to plik2 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 zawierają 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 po otwarciu gniazda sieciowego ma on deskryptor gniazda.
W niektórych systemach operacyjnych 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 rozpoczyna się w powiedz 0, a kończy powiedz w 1; Proces B zaczyna powiedz w 2, a kończy powie w 3) i tak dalej, ale o ile wiem, zwykle w nowoczesnych systemach operacyjnych plik deskryptory nie są globalne i faktycznie są specyficzne dla procesu (proces A rozpoczyna się w powiedz 0 i kończy powiedz w 5, podczas gdy proces B rozpoczyna się w 0 i kończy powiedz w 10).
źródło
Deskryptory plików
źródło
Uzupełnienie przede wszystkim uproszczonych odpowiedzi.
Jeśli pracujesz z plikami w skrypcie bash, lepiej użyć deskryptora pliku.
Na przykład: -
Chcesz czytać i zapisywać z / do pliku „test.txt”.
Użyj deskryptora pliku, jak pokazano poniżej
źródło
Deskryptory plików to deskryptory pliku. Dają linki do pliku. Za ich pomocą możemy czytać, pisać i otwierać pliki.
źródło