Kiedy próbujesz przekierować wyjście programu za pomocą składni „jakaś liczba większa niż” (np. foo 2> myfile
), Jakie są tutaj możliwe liczby i co one reprezentują?
Wierzę, że 1 to /dev/stdout
2 to /dev/stderr
. Co z 5 i 6? Czy jest 3, 4 lub jakaś liczba większa niż 6?
io-redirection
file-descriptors
fifo
Student Fermata
źródło
źródło
Odpowiedzi:
Ten rzekomy program zapisze pod podanym przez ciebie deskryptorem pliku. rozważ następujący program witaj na świecie:
skompiluj to
teraz prosty bieg
brak pliku dla 5, więc nie zapisano bajtu.
następna próba:
Udaje mi się uzyskać wynik, określając plik i deskryptor pliku (np
5>u
.).W praktyce, chyba że napisałeś tak zabawny program jak powyżej, jest mało prawdopodobne, aby gromadzić dane przy użyciu
5>foo
.w skrypcie powłoki konstrukcje przy użyciu <() są bardziej przydatne:
źródło
write()
zwracassize_t
nieint
.Liczby reprezentują deskryptory plików (uchwyty do plików, które zostały otwarte).
Powłoka zwykle ma 3 ustawione automatycznie,
0 - stdin 1 - stdout 2 - stderr
Ale można otwierać kolejne pliki i zwiększać liczby.
źródło
Te liczby są deskryptorami plików . Jak zauważyłeś, istnieje kilka, które są tworzone automatycznie. Gdy inne pliki lub rzeczy podobne do plików zostaną otwarte, otrzymają inne numery.
Liczby używane w danym programie zależą od tego, jakie pliki zostały otwarte przez ten program lub w inny sposób wykorzystane. Na przykład, jeśli chcesz „zapisać” bieżący stdin i tymczasowo przekierować stdin z innego miejsca, a następnie przywrócić go później, możesz zrobić coś takiego:
Więc ten skrypt miałby
4
deskryptor pliku dostępny przynajmniej przez jakiś czas. To 4 może być wszystkim, co nie jest używane (cóż, istnieje ograniczenie liczby plików, które proces może otworzyć, ale wszystko w tym limicie).Możesz zobaczyć, jakie deskryptory plików otworzył proces i gdzie są one otwarte, zaglądając do
/proc/<pid>/fd
. Pokazuje wszystkie otwarte deskryptory plików dla tego procesu<pid>
i pliki, z którymi są skojarzone.źródło
Każdy proces otrzymuje liczby całkowite jako deskryptory plików, przy czym w POSIX są trzy zarezerwowane: 0 to stdin, 1 to stdout, a 2 to stderr. Do kolejnych plików zostaną przypisane kolejne numery. Możesz to łatwo sprawdzić za pomocą tego programu, zapisz go jako fdtest.c , aby mógł otworzyć swój własny kod programu podczas działania:
Skompiluj to:
Uruchom:
Wynik, który otrzymasz, jest mniej więcej taki:
... który jest numerem deskryptora pliku, do którego odnosi się zmienna
fd
.źródło