امیرحسین کریم پور
مدیر ارشد توسینسو و متخصص سرویس های مایکروسافت

File Descriptor چیست؟ بررسی مفهوم FD در لینوکس

در این مطلب می خواهیم در مورد مفهمومی به نام File Descriptor در لینوکس برای شما عزیزان صحبت کنیم. به زبان ساده File Descriptor شماره ای است که بصورت Unique یا منحصر بفرد به فایلی را که در سیستم عامل بصورت باز قرار دارد اختصاص داده می شود و بوسیله آن هر فایل از یکدیگر تمییز داده می شود. File Descriptor منابع اطلاعاتی و چگونگی دسترسی به آن را در سیستم عامل توصیف می کند. در سیستم عامل های لینوکس و همچنین یونیکس همه چیز یک فایل است.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

فایل های معمولی ، دایرکتوری ها ، Symbolic link ها ، Local domain socket ها و حتی Device ها ( مثل Block device ها و Character device ها ) نیز از نگاه Kernel یا هسته سیستم عامل لینوکس یک فایل به حساب می آیند و File Descriptor های خود را دارند. حتی صفحه نمایش شما نیز یک فایل است و File Descriptor دارد . وقتی برنامه ای اجرا می شود خروجی برنامه به File Descriptor صفحه نمایش ارسال می شود و شما میتوانید خروجی را در صفحه نمایش سیستم تان ببینید. حال اگر خروجی به File Descriptor یک دستگاه پرینتر ارسال شود خروجی برنامه چیزی است که پرینتر آنرا چاپ می کند.

زمانی که شما یک برنامه یا دستور را اجرا می کنید سه فایل هستند که همیشه باز هستند ، این ها عبارتند از :

  1. Standard Input
  2. Standard Output
  3. Standard Error

این سه فایل همیشه باز هستند زمانی که برنامه اجرا می شود. شماره مربوط به این فایل ها ( FD ) بصورت زیر هستند :

File                          File Descriptor
Standard Input STDIN              0
Standard Output STDOUT            1
Standard Error STDERR             2

برای مثال زمانی که زمانی که در جستجوی فایل هستید تعدادی از فایل ها معمولا با خطای permission denied و یا خطا هایی از این قبیل همراه هستند. این خطا ها را می توان در یک فایل ذخیره کرد ، بصورت زیر :

$ ls mydir 2>errorsfile.txt

File Descriptor برای Standard Error برابر 2 است. اگر هیچ دایرکتوری با نام mydir در سیستم وجود نداشت خروجی دستور در فایل errorfile.txt ذخیره خواهد شد. با استفاده از "<2" ما خطایی که در خروجی این دستور رخ خواهد داد را به فایل errorfile.txt در اصطلاح فنی Redirect می کنیم و شما در خروجی دستور در پنجره Terminal Emulator تان هیچ اروری را مشاهده نخواهید کرد.

وب سایت توسینسو

File Descriptor ها به PID ها Bound شده اند. به مثال زیر دقت کنید :

#>sleep 1000 &
[12] 14726

ما در دستور بالا یک پراسس با شماره 14726 ایجاد کردیم. با اجرای دستور lsof -p 14726 چیزی شبیه زیر را میتوانیم مشاهده کنیم :

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sleep   14726 root  cwd    DIR    8,1     4096 1201140 /home/x
sleep   14726 root  rtd    DIR    8,1     4096       2 /
sleep   14726 root  txt    REG    8,1    35000  786587 /bin/sleep
sleep   14726 root  mem    REG    8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep   14726 root  mem    REG    8,1  2030544  137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep   14726 root  mem    REG    8,1   170960  137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep   14726 root    0u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    1u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    2u   CHR  136,6      0t0       9 /dev/pts/6

چهارمین ستون یا FD که مخفف File Descriptor هست و ستون بعدی یعنی TYPE مربوط به File Descriptor و File Descriptor type هستند. همانطور که مشاهده می کنید برخی از مقادیر برای FD می تواند شامل مقدار cwd یا Current Working Directory ، مقدار txt یا Text file ، مقدار mem یا Memory mapped file و مقدار mmap یا Memory mapped device باشد. در سه سطر آخر کاراکتر u نشان دهنده این است که فایل هم برای Read و هم برای Write شدن باز شده است. بعبارتی یوزر می تواند روی آن دستگاه ( که حالا میتواند فلش درایو یا هر چیز دیگری باشد ) Read و Write داشته باشد. در ستون TYPE همانطور که از اسمش نیز مشخص است نشان دهنده نوع فایل است که REG یا Regular File به معنای فایل معمولی ( متنی ، صوتی ، تصویری ، ... ) است ، DIR یا Directory که خود یک نوع فایل است ، FIFO یا First In First Out و CHR یا Character Device را می توانیم مشاهده کنیم.

توجه کنید زمانیکه شما یک فایلی را باز می کنید یا یک فایل را ایجاد می کنید Kernel حداقل یک File Descriptor به Process آن اختصاص می دهد. و نیز زمانی که میخواهیم یک فایل را Read یا روی آن Write کنیم ما فایل را توسط File Descriptor شناسایی می کنیم که هنگام باز کردن یا ایجاد کردن به عنوان یک آرگومان برای Read یا Write کردن بازگشت داده می شود. نکته ای که در خصوص File Descriptor وجود دارد این است که عدد منفی و نیز اعشاری ندارد و تمامی File Descriptor ها اعداد مثبت را به خودشان اختصاص می دهند. نکته بعدی این است که Child Process های یک Parent Process یا پراسس والد File Descriptor هایشان را از Parent Process به ارث میبرند. امیدوارم مورد توجه شما قرار گرفته باشد.

نویسنده : امیرحسین کریم پور

منبع : جزیره لینوکس و سیستم های متن باز وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی میباشد


امیرحسین کریم پور
امیرحسین کریم پور

مدیر ارشد توسینسو و متخصص سرویس های مایکروسافت

امیرحسین کریم پور ، مدیر ارشد توسینسو ، متخصص شبکه ، تخصص در حوزه سیستم عامل های کلاینت و سرور مایکروسافت و سرویس های مربوطه ، سیستم عامل لینوکس و... ، سابقه کار با سازمان ها و شرکت های مختلف در زمینه سرویس های مایکروسافت در قالب پروژه ، مشاوره و آموزش. علاقه مند به حوزه امنیت اطلاعات و تست نفوذ سنجی

نظرات