/proc/pid/fd/ - deskryptory pliku
- /proc/pid/fd/
- Jest to podkatalog zawierający po jednym wpisie dla każdego
otwartego przez proces pliku; nazwą tego wpisu jest deskryptor
pliku i jest on dowiązaniem symbolicznym do rzeczywistego pliku.
Dlatego 0 jest standardowym wejściem, 1 jest standardowym
wyjściem, 2 jest standardową diagnostyką, itd.
- W przypadku deskryptorów plików potoków i gniazd,
wpisy będą dowiązaniami symbolicznymi, których
zawartością jest typ pliku z i-węzłem.
Wywołanie readlink(2) na takim pliku zwróci
ciąg w postaci:
-
typ:[i-węzeł]
- Przykładowo socket:[2248868] będzie gniazdem z
i-węzłem 2248868. W przypadku gniazd, i-węzeł
można wykorzystać do pozyskania większej liczby
informacji z jednego z plików z katalogu /proc/net/.
- W przypadku deskryptorów plików, które nie
mają odpowiadającego i-węzła (np.
deskryptorów plików tworzonych za pomocą
bpf(2), epoll_create(2), eventfd(2),
inotify_init(2), perf_event_open(2), signalfd(2),
timerfd_create(2) i userfaultfd(2)), wpis będzie
dowiązaniem symbolicznym z zawartością w postaci
-
anon_inode:typ-pliku
- W wielu przypadkach (lecz nie wszystkich) typ-pliku jest otoczony
nawiasami kwadratowymi.
- Przykładowo dowiązanie symboliczne deskryptora pliku epoll
będzie dowiązaniem symbolicznym, którego
zawartością jest łańcuch
anon_inode:[eventpoll].
- W procesie wielowątkowym zawartość tego katalogu nie
jest dostępna, jeżeli wątek główny
już się zakończył (zazwyczaj przez
wywołanie pthread_exit(3)).
- Programy, które przyjmują nazwę pliku jako argument
wiersza polecenia, lecz nie czytają standardowego wejścia,
jeśli nie podano argumentu oraz programy które
zapisują do pliku nazwanego argumentem wiersza polecenia, lecz nie
wysyłają danych wyjściowych na standardowe
wyjście, można zmusić do używania
standardowego wejścia lub wyjścia wykorzystując pliki
/proc/pid/fd jako argumenty wiersza poleceń. Na
przykład, zakładając, że opcja -i
określa plik wejściowy, a opcja -o określa
plik wyjściowy:
-
$ foobar -i /proc/self/fd/0 -o /proc/self/fd/1 ...
- co daje działający filtr.
- /proc/self/fd/N jest w przybliżeniu tym samym co
/dev/fd/N na niektórych systemach uniksowych i
uniksopodobnych. Większość linuksowych
skryptów MAKEDEV tworzy dowiązania symboliczne
/dev/fd do /proc/self/fd.
- Większość systemów udostępnia
dowiązania symboliczne /dev/stdin, /dev/stdout i
dev/stderr, które linkują odpowiednio do
plików 0, 1 i 2 w /proc/self/fd.
Powyższe, przykładowe polecenie może być
więc zapisane również tak:
-
$ foobar -i /dev/stdin -o /dev/stdout ...
- Uprawnienie do rozwiązania lub odczytu (readlink(2))
dowiązań symbolicznych w tym katalogu, zależy od
sprawdzenia trybu dostępu ptrace: PTRACE_MODE_READ_FSCREDS;
zob. ptrace(2).
- Proszę zauważyć, że w przypadku
deskryptorów pliku odnoszących się do
i-węzłów (potoków i gniazd, zob.
wyżej), ich i-węzły mają bity uprawnień
i informacje o własności odmienne od tych, z wpisu
/proc/pid/fd, a własność może
się różnić od identyfikatorów
użytkownika i grupy procesu. Proces nieuprzywilejowany może
nie mieć odpowiednich uprawnień do ich otwarcia, jak w tym
przykładzie:
-
$ echo test | sudo -u nobody cat
test
$ echo test | sudo -u nobody cat /proc/self/fd/0
cat: /proc/self/fd/0: Brak dostępu
- Deskryptor pliku 0 odnosi się do potoku utworzonego przez
powłokę i będącego
własnością tego użytkownika powłoki,
którym nie jest nobody, zatem cat nie ma
uprawnień do utworzenia nowego deskryptora pliku do odczytu z tego
i-węzła, nawet gdy może wciąż
czytać z jego istniejącego deskryptora pliku 0.
Tłumaczenie niniejszej strony podręcznika: Przemek
Borys <pborys@dione.ids.pl>, Robert Luberda <robert@debian.org>
i Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną
dokumentacją. Bliższe informacje o warunkach licencji
można uzyskać zapoznając się z
GNU General
Public License w wersji 3 lub nowszej. Nie przyjmuje się
ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika
prosimy zgłaszać na adres listy dyskusyjnej
manpages-pl-list@lists.sourceforge.net.