واصف الملف

واصف الملف (File Descriptor) في أنظمة التشغيل لينكس أو يونكس هو مؤشر على اتصال يتم الحفاظ عليه من قبل النواة لأداء عمليات الإدخال/الإخراج. في أنظمة التشغيل المعتمدة على ويندوز، يُعرف باسم "مقبض الملف" (filehandle). وهو يمثل الاتصال (عادةً بملف) بين نظام التشغيل وأداء عمليات الإدخال/الإخراج للبيانات (Bytes). بشكل افتراضي، أول ثلاثة أوصاف للملفات في Linux هي:

عادةً ما تكون قيم أوصاف الملفات أعداد صحيحة غير سالبة، بينما تُستخدم القيم السالبة للدلالة على "عدم وجود قيمة" أو لتمثيل حالات الخطأ.

أوصاف الملفات هي جزء من واجهة برمجة التطبيقات POSIX. ويجب أن يكون لدى كل عملية في Unix (باستثناء العمليات الخلفية أو ما يعرف بـ daemons) ثلاثة أوصاف ملفات قياسية تتوافق مع الثلاثة تدفقات القياسية:

قيمة صحيحة اسم ثابت رمزي [1] مجرى الملف [2]
0 المدخلات القياسية STDIN_FILENO stdin
1 الناتج القياسي STDIN_FILENO stdout
2 خطأ معياري STDERR_FILENO stderr

ملخص

موصفات الملفات لعملية واحدة وجدول الملفات وجدول العقد . لاحظ أن العديد من موصفات الملفات يمكن أن تشير إلى نفس إدخال جدول الملف (على سبيل المثال، نتيجة لاستدعاء النظام dup [3] :104) وأن إدخالات جدول الملفات المتعددة يمكنها بدورها أن تشير إلى نفس العقدة (إذا تم فتحها عدة مرات؛ لا يزال الجدول مبسطًا لأنه يمثل العقد حسب أسماء الملفات، على الرغم من أن العقدة يمكن أن يكون لها أسماء متعددة ). لا يشير موصوف الملف 3 إلى أي شيء في جدول الملف، مما يدل على أنه تم إغلاقه.

في التنفيذ التقليدي لنظام Unix، تقوم أوصاف الملفات (File Descriptors) بعملية الفهرسة في جدول أوصاف ملفات خاص بكل عملية يُدار بواسطة النواة، والذي يقوم بدوره بفهرسة جدول ملفات على مستوى النظام بأكمله يُعرف بـ"جدول الملفات" (File Table)، ويحتوي على الملفات المفتوحة بواسطة جميع العمليات. يسجل هذا الجدول وضعية فتح الملف (أو المورد الآخر) مثل: للقراءة، الكتابة، الإلحاق، وربما أوضاع أخرى. كما يقوم أيضًا بالفهرسة في جدول ثالث يسمى "جدول الإينود" (inode table) الذي يصف الملفات الفعلية الأساسية.

لأداء عمليات الإدخال أو الإخراج، تقوم العملية بتمرير وصف الملف إلى النواة عبر نداء نظام (System Call)، حيث تصل النواة إلى الملف نيابة عن العملية. العملية نفسها ليس لديها وصول مباشر إلى جداول الملفات أو جداول الإينود.

في نظام Linux، يمكن الوصول إلى مجموعة أوصاف الملفات المفتوحة في عملية معينة من خلال المسار `/proc/PID/fd/`، حيث يمثل `PID` معرف العملية. وصف الملف `/proc/PID/fd/0` يمثل الإدخال القياسي (stdin)، و`/proc/PID/fd/1` يمثل الإخراج القياسي (stdout)، و`/proc/PID/fd/2` يمثل الأخطاء القياسية (stderr). كاختصار لهذه المسارات، يمكن لأي عملية جارية الوصول إلى أوصاف ملفاتها الخاصة عبر المجلدات `/proc/self/fd` و`/dev/fd`.

في الأنظمة المشابهة لـ Unix، يمكن أن تشير أوصاف الملفات إلى أي نوع من ملفات Unix المسمّاة في نظام الملفات. بالإضافة إلى الملفات العادية، يتضمن ذلك الأدلة (directories)، وأجهزة الكتل (block devices) والأجهزة الرمزية (character devices) التي تُعرف أيضًا بـ"الملفات الخاصة" (special files)، ومقابس نطاق Unix (Unix domain sockets)، والأنابيب المسماة (named pipes). كما يمكن لأوصاف الملفات أن تشير إلى كائنات أخرى لا تكون موجودة عادةً في نظام الملفات، مثل الأنابيب المجهولة (anonymous pipes) ومقابس الشبكة (network sockets).

عادةً ما يتضمن هيكل بيانات FILE في مكتبة الإدخال/الإخراج القياسية C موصوف ملف منخفض المستوى للكائن المعني على أنظمة شبيهة بنظام Unix. يوفر هيكل البيانات الإجمالي تجريدًا إضافيًا ويعرف بدلاً من ذلك باسم مقبض الملف.

العمليات على أوصاف الملفات

تتضمن القائمة التالية العمليات النموذجية على موصوفات الملفات على أنظمة التشغيل الحديثة الشبيهة بنظام يونكس . يتم إعلان معظم هذه الوظائف في رأس <unistd.h> ، ولكن بعضها يكون في رأس <fcntl.h> بدلاً من ذلك.

إنشاء أوصاف الملفات

  • open()
  • creat()[4]
  • socket()
  • accept()
  • socketpair()
  • pipe()
  • epoll_create() (Linux)
  • signalfd() (Linux)
  • eventfd() (Linux)
  • timerfd_create() (Linux)
  • memfd_create() (Linux)
  • userfaultfd() (Linux)
  • fanotify_init() (Linux)
  • inotify_init() (Linux)
  • clone() (with flag CLONE_PIDFD, Linux)
  • pidfd_open() (Linux)
  • open_by_handle_at() (Linux)
  • kqueue() (BSD)
  • pdfork() (kFreeBSD)

اشتقاق أوصاف الملفات

  • dirfd()
  • fileno()

العمليات على موصوف ملف واحد

  • read(), write()
  • readv(), writev()
  • pread(), pwrite()
  • recv(), send()
  • recvfrom(), sendto()
  • recvmsg(), sendmsg() (also used for sending FDs to other processes over a Unix domain socket)
  • recvmmsg(), sendmmsg()
  • lseek(), llseek()
  • fstat()
  • fstatvfs()
  • fchmod()
  • fchown()
  • ftruncate()
  • fsync()
  • fdatasync()
  • fdopendir()
  • fgetxattr(), fsetxattr() (Linux)
  • flistxattr(), fremovexattr() (Linux)
  • statx (Linux)
  • setns (Linux)
  • vmsplice() (Linux)
  • pidfd_send_signal() (Linux)
  • pdkill() (kFreeBSD)
  • waitid() (with P_PIDFD ID type, Linux)
  • fdopen() (stdio function:converts file descriptor to FILE*)
  • dprintf() (stdio function: prints to file descriptor)

العمليات على ملفات تعريف متعددة

  • <span about="#mwt234" class="monospaced" data-ve-ignore="true" id="mwASs">يختار()</span> ،pselect()
  • <span about="#mwt240" class="monospaced" data-ve-ignore="true" id="mwATE">استطلاع ()</span> ،ppoll()
  • ، ، (Linux، يتطلب ملف epoll واحد للانتظار على العديد من ملفات الوصف الأخرى)
  • <span about="#mwt252" class="monospaced" data-ve-ignore="true" id="mwAT4">epoll_ctl()</span> (لنظام Linux)
  • <span about="#mwt255" class="monospaced" data-ve-ignore="true" id="mwAUI">kqueue()</span> (لأنظمة تعتمد على BSD).
  • <span about="#mwt264" class="monospaced" data-ve-ignore="true" id="mwAUk">الوصل()</span> ،tee() (لنظام Linux)
  • (لنظام Linux)

العمليات على جدول وصف الملف

الfcntl()تُستخدم الدالة لإجراء عمليات مختلفة على موصوف الملف، اعتمادًا على وسيطة الأمر التي تم تمريرها إليه. توجد أوامر للحصول على السمات المرتبطة بوصف الملف وتعيينها، بما في ذلكF_GETFD, F_SETFD, F_GETFL وF_SETFL .

  • close()
  • closefrom() (BSD and Solaris only; deletes all file descriptors greater than or equal to specified number)
  • close_range() (for Linux)[5]
  • dup() (duplicates an existing file descriptor guaranteeing to be the lowest number available file descriptor)
  • dup2(), dup3() (Close fd1 if necessary, and make file descriptor fd1 point to the open file of fd2)
  • fcntl (F_DUPFD)

العمليات التي تعدل حالة العملية

  • fchdir() (sets the process's current working directory based on a directory file descriptor)
  • mmap() (maps ranges of a file into the process's address space)

قفل الملف

  • flock()
  • fcntl() (F_GETLK, F_SETLK and F_SETLKW)
  • lockf()

المقابس

  • connect()
  • bind()
  • listen()
  • accept() (creates a new file descriptor for an incoming connection)
  • getsockname()
  • getpeername()
  • getsockopt()
  • setsockopt()
  • shutdown() (shuts down one or both halves of a full duplex connection)

متنوع

  • <span about="#mwt353" class="monospaced" data-ve-ignore="true" id="mwAac">ioctl()</span> (مجموعة كبيرة من العمليات المتنوعة على موصوف ملف واحد، غالبًا ما يرتبط بجهاز)

at عمليات اللواحق

تمت إضافة سلسلة من العمليات الجديدة إلى العديد من الأنظمة الحديثة الشبيهة بنظام يونكس، بالإضافة إلى العديد من مكتبات C، ليتم توحيدها في إصدار مستقبلي من POSIX . [6] تشير اللاحقة at إلى أن الوظيفة تأخذ وسيطة أولى إضافية توفر موصوف ملف يتم من خلاله حل المسارات النسبية ، وبالتالي تصبح النماذج التي تفتقر إلى اللاحقة at معادلة لتمرير موصوف ملف يتوافق مع دليل العمل الحالي. الهدف من هذه العمليات الجديدة هو الدفاع ضد فئة معينة من هجمات TOCTOU .

  • openat()
  • faccessat()
  • fchmodat()
  • fchownat()
  • fstatat()
  • futimesat()
  • linkat()
  • mkdirat()
  • mknodat()
  • readlinkat()
  • renameat()
  • symlinkat()
  • unlinkat()
  • mkfifoat()
  • fdopendir()

أوصاف الملفات كقدرات

تتصرف أوصاف ملفات يونكس بطرق عديدة كقدرات . يمكن تمريرها بين العمليات عبر مآخذ نطاق Unix باستخدام نداء النظام sendmsg () . لاحظ، مع ذلك، أن ما يتم تمريره فعليًا هو إشارة إلى "وصف ملف مفتوح" له حالة قابلة للتغيير (إزاحة الملف، وحالة الملف وعلامات الوصول). يؤدي هذا إلى تعقيد الاستخدام الآمن لواصفات الملفات كقدرات، حيث عندما تتشارك البرامج في الوصول إلى نفس وصف الملف المفتوح، فيمكنها التدخل في استخدام بعضها البعض له عن طريق تغيير إزاحته أو ما إذا كان حاجبًا أم غير حاجب، على سبيل المثال. [7] [8] في أنظمة التشغيل المصممة خصيصًا كأنظمة قدرات، نادرًا ما توجد حالة قابلة للتغيير مرتبطة بالقدرة نفسها.

انظر أيضا

  • مثبت (يونكس)
  • لسوف
  • كتلة التحكم في الملفات (FCB) - مخطط بديل في CP/M والإصدارات المبكرة من DOS

مراجع

  1. ^ The Open Group. "The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008, 2016 Edition". مؤرشف من الأصل في 2013-04-15. اطلع عليه بتاريخ 2017-09-21.
  2. ^ The Open Group. "The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008, 2016 Edition". <stdio.h>. اطلع عليه بتاريخ 2017-09-21.
  3. ^ اكتب عنوان المرجع بين علامتي الفتح <ref> والإغلاق </ref> للمرجع bach
  4. ^ The Open Group. "The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008, 2018 Edition – creat". اطلع عليه بتاريخ 2019-04-11.
  5. ^ Stephen Kitt, Michael Kerrisk. "close_range(2) — Linux manual page". اطلع عليه بتاريخ 2021-03-22.
  6. ^ Extended API Set, Part 2. The Open Group. أكتوبر 2006. ISBN:1931624674. مؤرشف من الأصل في 2013-01-13.
  7. ^ Brinkmann، Marcus (4 فبراير 2009). "Building a bridge: library API's and file descriptors?". cap-talk. مؤرشف من الأصل في 2012-07-30. اطلع عليه بتاريخ 2017-09-21.
  8. ^ de Boyne Pollard، Jonathan (2007). "Don't set shared file descriptors to non-blocking I/O mode". اطلع عليه بتاريخ 2017-09-21.