# واصف الملف

واصف الملف (File Descriptor) في أنظمة التشغيل لينكس أو يونكس هو مؤشر على اتصال يتم الحفاظ عليه من قبل النواة لأداء عمليات الإدخال/الإخراج. في أنظمة التشغيل المعتمدة على ويندوز، يُعرف باسم "مقبض الملف" (filehandle). وهو يمثل الاتصال (عادةً بملف) بين نظام التشغيل وأداء عمليات الإدخال/الإخراج للبيانات (Bytes). بشكل افتراضي، أول ثلاثة أوصاف للملفات في Linux هي:
عادةً ما تكون قيم أوصاف الملفات أعداد صحيحة غير سالبة، بينما تُستخدم القيم السالبة للدلالة على "عدم وجود قيمة" أو لتمثيل حالات الخطأ.
أوصاف الملفات هي جزء من واجهة برمجة التطبيقات POSIX. ويجب أن يكون لدى كل عملية في Unix (باستثناء العمليات الخلفية أو ما يعرف بـ daemons) ثلاثة أوصاف ملفات قياسية تتوافق مع الثلاثة تدفقات القياسية:
| قيمة صحيحة | اسم | ثابت رمزي | مجرى الملف |
| 0 | المدخلات القياسية | STDIN_FILENO | stdin |
| 1 | الناتج القياسي | STDIN_FILENO | stdout |
| 2 | خطأ معياري | STDERR_FILENO | stderr |

## ملخص

في التنفيذ التقليدي لنظام 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
* 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)
* 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 . تشير اللاحقة at إلى أن الوظيفة تأخذ وسيطة أولى إضافية توفر موصوف ملف يتم من خلاله حل المسارات النسبية ، وبالتالي تصبح النماذج التي تفتقر إلى اللاحقة at معادلة لتمرير موصوف ملف يتوافق مع دليل العمل الحالي. الهدف من هذه العمليات الجديدة هو الدفاع ضد فئة معينة من هجمات TOCTOU .
* openat
* faccessat
* fchmodat
* fchownat
* fstatat
* futimesat
* linkat
* mkdirat
* mknodat
* readlinkat
* renameat
* symlinkat
* unlinkat
* mkfifoat
* fdopendir

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

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

## انظر أيضا

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

## مراجع

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