deskryptor pliku

Zaktualizowano: 03/13/2021 przez Computer Hope

deskryptory plików ilustracja

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:

  1. udziela dostępu.
  2. tworzy wpis w globalnej tabeli plików.
  3. 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.).

schemat deskryptora pliku

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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.