proc_pid_fd(5) File Formats Manual proc_pid_fd(5)

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 موجود خود بخواند.

proc(5)

2024-05-02 Linux man-pages 6.9.1