Co to jest deskryptor plików?

Deskryptor pliku to numer, który jednoznacznie identyfikuje otwarty plik w systemie operacyjnym komputera. Opisuje zasób danych i sposób uzyskiwania dostępu do tego zasobu.

Gdy program prosi o otwarcie pliku - lub innego zasobu danych, takiego jak gniazdo sieciowe - jądro systemu operacyjnego udziela dostępu, dokonuje wpisu w globalnej tabeli plików i dostarcza oprogramowanie z 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 Uniksie i są używane przez nowoczesne systemy operacyjne, w tym Linux, macOS X i BSD. W systemie Microsoft Windows deskryptory plików są znane jako uchwyty plików.

  • Przegląd
  • Stdin, stdout i stderr
  • Przekierowywanie deskryptorów plików

Gdy proces wykonuje pomyślne żądanie otwarcia pliku, jądro zwraca deskryptor pliku, który wskazuje na wpis w globalnej tabeli plików jądra. Wpis tabeli plików zawiera informacje, takie jak i-węzeł pliku, przesunięcie bajtów i ograniczenia dostępu dla tego strumienia danych (tylko do odczytu, tylko do zapisu itp.).

Stdin, stdout i stderr

W systemie operacyjnym podobnym do Uniksa, pierwsze trzy deskryptory plików, domyślnie, to STDIN (standardowe wejście), STDOUT (standardowe wyjście) i STDERR (standardowy błąd).

ImięDeskryptor plikuOpisSkrót
Standardowe wejście0Domyślny strumień danych wejściowych, na przykład w potoku poleceń. W terminalu domyślnie jest to wejście klawiatury od użytkownika.stdin
Standardowe wyjście1Domyślny strumień danych wyjściowych, na przykład gdy polecenie drukuje tekst. W terminalu domyślnie jest to ekran użytkownika.stdout
Standardowy błąd2Domyślny strumień danych dla danych wyjściowych związanych z występującym błędem. W terminalu domyślnie jest to ekran użytkownika.stderr

Przekierowywanie deskryptorów plików

Dostęp do deskryptorów plików można uzyskać bezpośrednio za pomocą bash, domyślnej powłoki systemu Linux, macOS X i podsystemu Windows dla systemu Linux.

Na przykład, gdy używasz polecenia find, udane wyjście przechodzi do stdout (deskryptor pliku 1 ), a komunikaty o błędach przechodzą do stderr (deskryptor pliku 2 ). Oba strumienie są wyświetlane jako wyjście terminala:

 find / -name '* coś *' 
 / usr / share / doc / something / usr / share / doc / something / examples / something_random find: `/ run / udisks2 ': Odmowa dostępu find:` / run / wpa_supplicant': Odmowa uprawnień / usr / share / something / usr / gry / coś 

Dostajemy błędy, ponieważ find próbuje przeszukać kilka katalogów systemowych, do których nie mamy uprawnień. Wszystkie wiersze, które mówią „Odmowa uprawnień”, zostały zapisane na stderr, a pozostałe linie zostały zapisane na standardowe wyjście .

Możesz ukryć stderr, przekierowując deskryptor pliku 2 do / dev / null, specjalnego urządzenia w Linuksie, które „idzie nigdzie”:

 find / -name '* coś *' 2> / dev / null 
 / usr / share / doc / something / usr / share / doc / something / examples / something_random / usr / share / something / usr / games / something 

Błędy zostały wysł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ść polecenia find, zauważysz, że komunikaty o błędach nie są filtrowane, ponieważ tylko standardowe wyjście jest przesyłane potokiem do grep .

 find / -name '* coś *' | grep „coś” 
 / usr / share / doc / something / usr / share / doc / something / examples / something_random find: `/ run / udisks2 ': Odmowa dostępu find:` / run / wpa_supplicant': Odmowa uprawnień / usr / share / something / usr / gry / coś 

Możesz jednak przekierować standardowy błąd na standardowe wyjście, a następnie grep przetworzy tekst obu:

 find / -name '* coś *' 2> & 1 | grep „coś” 
 / usr / share / doc / something / usr / share / doc / something / examples / something_random / usr / share / something / usr / games / something 

Zauważ, że w powyższym poleceniu deskryptor pliku docelowego ( 1 ) jest poprzedzony znakiem ampersand („ & ”). Aby uzyskać więcej informacji na temat przekierowania strumienia danych, zobacz potoki w powłoce bash.

Przykłady tworzenia i używania deskryptorów plików w bashu znajdują się w przykładach wbudowanych komend exec.

Uchwyt pliku, warunki systemu operacyjnego