deskryptor pliku to numer, który jednoznacznie identyfikuje otwarty plik w systemie operacyjnym komputera. Opisuje zasób danych i sposób, w jaki można uzyskać do niego dostęp.
gdy program prosi o otwarcie pliku — lub innego zasobu danych, takiego jak gniazdo sieciowe — jądro:
- udziela dostępu.
- tworzy wpis w globalnej tabeli plików.
- udostępnia programowi lokalizację tego wpisu.
deskryptor jest identyfikowany przez unikalną nieujemną liczbę całkowitą, taką jak 0, 12 lub 567. Dla każdego otwartego pliku w systemie istnieje co najmniej jeden deskryptor pliku.
deskryptory plików zostały po raz pierwszy użyte w systemie Unix i są używane przez nowoczesne systemy operacyjne, w tym Linux, macOS i BSD. W systemie Microsoft Windows deskryptory plików są znane jako uchwyty plików.
przegląd
gdy proces wysyła pomyślne żądanie otwarcia pliku, jądro zwraca deskryptor pliku, który wskazuje na wpis w globalnej tabeli plików jądra. Pozycja w tabeli plików zawiera informacje takie jak i-węzeł pliku, przesunięcie bajtów oraz ograniczenia dostępu dla tego strumienia danych (tylko do odczytu, tylko do zapisu, itd.).
Stdin, stdout i stderr
w Uniksopodobnym systemie operacyjnym pierwsze trzy deskryptory plików domyślnie to STDIN (standardowe wejście), STDOUT (standardowe wyjście) i stderr (standardowy błąd).
Nazwa | deskryptor pliku | opis | Skrót |
---|---|---|---|
standardowe wejście | 0 | domyślny strumień danych wejściowych, na przykład w potoku poleceń. W terminalu domyślnie jest to wprowadzanie klawiatury przez użytkownika. | stdin |
standardowe wyjście | 1 | domyślny strumień danych wyjściowych, na przykład gdy polecenie wypisuje tekst. W terminalu domyślnie jest to ekran użytkownika. | stdout |
błąd standardowy | 2 | domyślny strumień danych dla wyjścia odnoszący się do występującego błędu. W terminalu domyślnie jest to ekran użytkownika. | stderr |
przekierowanie deskryptorów plików
deskryptory plików mogą być bezpośrednio dostępne za pomocą bash, domyślnej powłoki podsystemu Linux, macOS X i Windows dla Linuksa.
na przykład, gdy używasz polecenia Znajdź, pomyślne wyjście przechodzi do stdout (deskryptor pliku 1), A komunikaty o błędach do stderr (deskryptor pliku 2). Oba strumienie wyświetlają się jako wyjście terminala:
find / -name '*something*'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something
otrzymujemy błędy, ponieważ find próbuje przeszukać kilka katalogów systemowych, których nie mamy uprawnień do odczytu. Wszystkie linijki z napisem „Permission denied” zostały napisane na stderr, a pozostałe linijki na stdout.
możesz ukryć stderr, przekierowując deskryptor pliku 2 do/dev/null, specjalnego urządzenia w Linuksie, które „nigdzie nie idzie”:
find / -name '*something*' 2>/dev/null
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
błędy wysyłane do/dev / null i nie są wyświetlane.
zrozumienie różnicy między stdout i stderr jest ważne, gdy chcesz pracować z wyjściem programu. Na przykład, jeśli spróbujesz grep wyjście polecenia find, zauważysz, że komunikaty o błędach nie są filtrowane, ponieważ tylko standardowe wyjście jest przesyłane do grep.
find / -name '*something*' | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_randomfind: `/run/udisks2': Permission deniedfind: `/run/wpa_supplicant': Permission denied/usr/share/something/usr/games/something
jednak Możesz przekierować standardowy błąd na standardowe wyjście, a następnie grep przetworzy tekst obu:
find / -name '*something*' 2>&1 | grep 'something'
/usr/share/doc/something/usr/share/doc/something/examples/something_random/usr/share/something/usr/games/something
zauważ, że w powyższe polecenie, deskryptor pliku docelowego (1) jest poprzedzony znakiem ampersand („&”). Aby uzyskać więcej informacji na temat przekierowywania strumienia danych, zobacz potoki w powłoce bash.
przykłady tworzenia i używania deskryptorów plików w bash można znaleźć w przykładach wbudowanych poleceń exec.
obsługa plików, warunki systemu operacyjnego