proc_pid_fd -
توصیفکنندههای
فایلهای
باز
فرآیند
- /proc/pid/fd/
- این یک
زیردایرکتوری
شامل یک
مدخل برای
هر فایلی
است که
فرآیند باز
کرده است،
که با
توصیفکننده
فایل (file descriptor) آن
نامگذاری
شده و یک
پیوند
نمادین به
فایل واقعی
است.
بنابراین، 0
ورودی
استاندارد،
1 خروجی
استاندارد،
2 خطای
استاندارد
و به همین
ترتیب است.
- برای
توصیفکنندههای
فایل مربوط
به لولهها
(pipes) و سوکتها
(sockets)، مدخلها
پیوندهای
نمادینی
خواهند بود
که محتوای
آنها نوع
فایل به
همراه
اینود (inode) است.
یک
فراخوانی
readlink(2) روی این
فایل
رشتهای در
این قالب
برمیگرداند:
-
type:[inode]
- برای مثال،
socket:[2248868] یک سوکت
خواهد بود و
اینود آن 2248868
است. برای
سوکتها،
از آن اینود
میتوان
برای یافتن
اطلاعات
بیشتر در
یکی از
فایلهای
زیرمسیر /proc/net/
استفاده
کرد.
- برای
توصیفکنندههای
فایلی که
هیچ اینود
متناظری
ندارند
(برای
نمونه،
توصیفکنندههای
فایل
ایجادشده
توسط bpf(2)،
epoll_create(2)، eventfd(2)،
inotify_init(2)، perf_event_open(2)،
signalfd(2)، timerfd_create(2) و
userfaultfd(2))، مدخل
مربوطه یک
پیوند
نمادین با
محتوایی به
شکل زیر
خواهد بود:
-
anon_inode:file-type
- در بسیاری
از موارد
(اما نه همه
آنها)، file-type
درون کروشه
قرار دارد.
- برای مثال،
یک
توصیفکننده
فایل epoll
پیوند
نمادینی
خواهد داشت
که محتوای
آن رشتهی
anon_inode:[eventpoll] است.
- در یک
فرآیند
چندرشتهای
(multithreaded)، اگر
رشتهی
اصلی
پیشتر
خاتمه
یافته باشد
(معمولاً با
فراخوانی
pthread_exit(3))،
محتویات
این
دایرکتوری
در دسترس
نخواهد
بود.
- برنامههایی
که یک نام
فایل را
بهعنوان
آرگومان خط
فرمان
دریافت
میکنند،
اما در صورت
ارائه نشدن
آرگومان
ورودی را از
ورودی
استاندارد
نمیگیرند،
و
برنامههایی
که در فایلی
مشخصشده
در آرگومان
خط فرمان
مینویسند،
اما در صورت
ارائه نشدن
آرگومان
خروجی خود
را به خروجی
استاندارد
ارسال
نمیکنند،
با این حال
میتوانند
با استفاده
از
فایلهای
/proc/pid/fd
بهعنوان
آرگومانهای
خط فرمان،
وادار به
استفاده از
ورودی
استاندارد
یا خروجی
استاندارد
شوند. برای
مثال، با
فرض اینکه
-i گزینهای
برای تعیین
فایل ورودی
و -o
گزینهای
برای تعیین
فایل خروجی
باشد:
-
$ foobar -i /proc/self/fd/0 -o /proc/self/fd/1 ...
- و شما یک
فیلتر فعال
خواهید
داشت.
- /proc/self/fd/N در برخی
سیستمهای
UNIX و
شبهیونیکس
تقریباً
همانند /dev/fd/N
است. در
واقع،
بیشتر
اسکریپتهای
MAKEDEV در
لینوکس،
پیوند
نمادینی از
/dev/fd به /proc/self/fd
ایجاد
میکنند.
- بیشتر
سیستمها
پیوندهای
نمادین /dev/stdin،
/dev/stdout و /dev/stderr را
فراهم
میکنند که
به ترتیب به
فایلهای
0، 1 و 2 در
/proc/self/fd پیوند
دارند.
بنابراین
دستور مثال
بالا را
میتوان به
این صورت
نوشت:
-
$ foobar -i /dev/stdin -o /dev/stdout ...
- مجوز
ارجاعزدایی
(dereference) یا
خواندن (readlink(2))
پیوندهای
نمادین در
این
دایرکتوری
توسط بررسی
حالت
دسترسی ptrace
یعنی PTRACE_MODE_READ_FSCREDS
اداره
میشود؛
ببینید: ptrace(2).
- توجه داشته
باشید که
برای
توصیفکنندههای
فایل
اشارهکننده
به اینودها
(لولهها و
سوکتها،
بالا را
ببینید)، آن
اینودها
همچنان
بیتهای
دسترسی و
اطلاعات
مالکیتی
مجزایی از
مدخل /proc/pid/fd
دارند، و
مالک ممکن
است با
شناسههای
کاربری و
گروهی
فرآیند
متفاوت
باشد. یک
فرآیند
بدون
امتیاز
ممکن است
مجوز لازم
برای باز
کردن آنها
را نداشته
باشد،
همانطور
که در این
مثال نشان
داده شده
است:
-
$ echo test | sudo -u nobody cat
test
$ echo test | sudo -u nobody cat /proc/self/fd/0
cat: /proc/self/fd/0: Permission denied
- توصیفکننده
فایل 0 به
لولهای
اشاره دارد
که توسط
پوسته
ایجاد شده و
تحت مالکیت
کاربر همان
پوسته قرار
دارد که nobody
نیست؛
بنابراین
cat مجوز
ایجاد یک
توصیفکننده
فایل جدید
برای
خواندن از
آن اینود را
ندارد،
اگرچه
همچنان
میتواند
از
توصیفکننده
فایل 0
موجود خود
بخواند.