/proc/pid/fd/ - descriptori de fișiere
- /proc/pid/fd/
- Acesta este un subdirector care conține o intrare pentru fiecare
fișier pe care procesul îl are deschis, numit prin
descriptorul său de fișier, și care este o
legătură simbolică către fișierul real.
Astfel, 0 este intrarea standard, 1 ieșirea standard, 2
ieșirea de eroare standard și așa mai departe.
- Pentru descriptorii de fișiere pentru conducte și socluri,
intrările vor fi legături simbolice al căror
conținut este tipul de fișier cu nodul-i. Un apel
readlink(2) pe acest fișier returnează un șir
de caractere în formatul:
-
type:[nod-i]
- De exemplu, socket:[2248868] va fi un soclu, iar nodul-i al
său este 2248868. Pentru socluri, acest nod-i poate fi utilizat
pentru a găsi mai multe informații în unul dintre
fișierele de sub /proc/net/.
- Pentru descriptorii de fișier care nu au un nod-i corespondent (de
exemplu, descriptorii de fișier produși de bpf(2),
epoll_create(2), eventfd(2), inotify_init(2),
perf_event_open(2), signalfd(2), timerfd_create(2)
și userfaultfd(2)), intrarea va fi o legătură
simbolică cu conținutul de forma
-
anon_inode:tip-fișier
- În multe cazuri (dar nu în toate), tip-fișier
este încadrat între paranteze drepte.
- De exemplu, un descriptor de fișier epoll va avea o
legătură simbolică al cărei conținut
este șirul anon_inode:[eventpoll].
- Într-un proces cu mai multe fire de execuție,
conținutul acestui director nu este disponibil dacă firul de
execuție principal s-a încheiat deja (de obicei prin
apelarea pthread_exit(3)).
- Programele care primesc un nume de fișier ca argument al liniei de
comandă, dar nu primesc intrare de la intrarea standard dacă
nu este furnizat niciun argument, și programele care scriu
într-un fișier numit ca argument al liniei de
comandă, dar nu își trimit ieșirea la
ieșirea standard dacă nu este furnizat niciun argument, pot
fi totuși făcute să utilizeze intrarea standard sau
ieșirea standard prin utilizarea fișierelor
/proc/pid/fd ca argumente ale liniei de comandă. De
exemplu, presupunând că -i este fanionul care
desemnează un fișier de intrare și -o este
fanionul care desemnează un fișier de ieșire:
-
$ foobar -i /proc/self/fd/0 -o /proc/self/fd/1 ...
- și aveți un filtru funcțional.
- /proc/self/fd/N este aproximativ la fel ca /dev/fd/N
în unele sisteme UNIX și sisteme de tip UNIX. De fapt,
majoritatea scripturilor Linux MAKEDEV leagă simbolic
/dev/fd de /proc/self/fd.
- Majoritatea sistemelor oferă legături simbolice
/dev/stdin, /dev/stdout și /dev/stderr, care
fac legătura cu fișierele 0, 1 și
2 din /proc/self/fd. Astfel, exemplul de comandă de
mai sus ar putea fi scris după cum urmează:
-
$ foobar -i /dev/stdin -o /dev/stdout ...
- Permisiunea de a dereferenția sau de a citi (readlink(2))
legăturile simbolice din acest director este guvernată de o
verificare a modului de acces ptrace PTRACE_MODE_READ_FSCREDS;
consultați ptrace(2).
- Rețineți că pentru descriptorii de fișiere
care se referă la noduri-i (conducte și socluri, a se vedea
mai sus), acele noduri-i au în continuare biți de permisiune
și informații de proprietate distincte de cele ale
intrării /proc/pid/fd și că
proprietarul poate fi diferit de ID-urile de utilizator și de grup
ale procesului. Un proces neprivilegiat poate să nu aibă
permisiunea de a le deschide, ca în acest exemplu:
-
$ echo test | sudo -u nobody cat
test
$ echo test | sudo -u nobody cat /proc/self/fd/0
cat: /proc/self/fd/0: Permission denied
- Descriptorul de fișier 0 se referă la conducta creată
de shell și deținută de utilizatorul acelui shell,
care nu este nobody, deci cat nu are permisiunea de a crea
un nou descriptor de fișier pentru a citi din acel nod-i, chiar
dacă poate citi în continuare din descriptorul de
fișier 0 existent.
Traducerea în limba română a acestui manual a
fost făcută de Remus-Gabriel Chelu
<remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită;
citiți
Licența
publică generală GNU Versiunea 3 sau o versiune
ulterioară cu privire la condiții privind drepturile de autor.
NU se asumă NICIO RESPONSABILITATE.
Dacă găsiți erori în traducerea
acestui manual, vă rugăm să trimiteți un e-mail
la
translation-team-ro@lists.sourceforge.net.