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 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 wejście klawiatury od użytkownika. | stdin |
Standardowe wyjście | 1 | Domyślny strumień danych wyjściowych, na przykład gdy polecenie drukuje tekst. W terminalu domyślnie jest to ekran użytkownika. | stdout |
Standardowy błąd | 2 | Domyś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