هذه مقالة غير مراجعة.(نوفمبر 2024) |
واصف الملف (File Descriptor) في أنظمة التشغيل لينكس أو يونكس هو مؤشر على اتصال يتم الحفاظ عليه من قبل النواة لأداء عمليات الإدخال/الإخراج. في أنظمة التشغيل المعتمدة على ويندوز، يُعرف باسم "مقبض الملف" (filehandle). وهو يمثل الاتصال (عادةً بملف) بين نظام التشغيل وأداء عمليات الإدخال/الإخراج للبيانات (Bytes). بشكل افتراضي، أول ثلاثة أوصاف للملفات في Linux هي:
عادةً ما تكون قيم أوصاف الملفات أعداد صحيحة غير سالبة، بينما تُستخدم القيم السالبة للدلالة على "عدم وجود قيمة" أو لتمثيل حالات الخطأ.
أوصاف الملفات هي جزء من واجهة برمجة التطبيقات POSIX. ويجب أن يكون لدى كل عملية في Unix (باستثناء العمليات الخلفية أو ما يعرف بـ daemons) ثلاثة أوصاف ملفات قياسية تتوافق مع الثلاثة تدفقات القياسية:
قيمة صحيحة | اسم | ثابت رمزي [1] | مجرى الملف [2] |
---|---|---|---|
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>
بدلاً من ذلك.
الfcntl()تُستخدم الدالة لإجراء عمليات مختلفة على موصوف الملف، اعتمادًا على وسيطة الأمر التي تم تمريرها إليه. توجد أوامر للحصول على السمات المرتبطة بوصف الملف وتعيينها، بما في ذلكF_GETFD, F_SETFD, F_GETFL وF_SETFL .
at
عمليات اللواحقتمت إضافة سلسلة من العمليات الجديدة إلى العديد من الأنظمة الحديثة الشبيهة بنظام يونكس، بالإضافة إلى العديد من مكتبات C، ليتم توحيدها في إصدار مستقبلي من POSIX . [6] تشير اللاحقة at
إلى أن الوظيفة تأخذ وسيطة أولى إضافية توفر موصوف ملف يتم من خلاله حل المسارات النسبية ، وبالتالي تصبح النماذج التي تفتقر إلى اللاحقة at
معادلة لتمرير موصوف ملف يتوافق مع دليل العمل الحالي. الهدف من هذه العمليات الجديدة هو الدفاع ضد فئة معينة من هجمات TOCTOU .
تتصرف أوصاف ملفات يونكس بطرق عديدة كقدرات . يمكن تمريرها بين العمليات عبر مآخذ نطاق Unix باستخدام نداء النظام sendmsg ()
. لاحظ، مع ذلك، أن ما يتم تمريره فعليًا هو إشارة إلى "وصف ملف مفتوح" له حالة قابلة للتغيير (إزاحة الملف، وحالة الملف وعلامات الوصول). يؤدي هذا إلى تعقيد الاستخدام الآمن لواصفات الملفات كقدرات، حيث عندما تتشارك البرامج في الوصول إلى نفس وصف الملف المفتوح، فيمكنها التدخل في استخدام بعضها البعض له عن طريق تغيير إزاحته أو ما إذا كان حاجبًا أم غير حاجب، على سبيل المثال. [7] [8] في أنظمة التشغيل المصممة خصيصًا كأنظمة قدرات، نادرًا ما توجد حالة قابلة للتغيير مرتبطة بالقدرة نفسها.
<ref>
والإغلاق </ref>
للمرجع bach