إغلاق (استدعاء النظام)
استدعاء نظام الإغلاق هو استدعاء نظام يُستخدم لإغلاق مُعرّف ملف بواسطة نواة النظام . في معظم أنظمة الملفات ، يُنهي البرنامج الوصول إلى ملف في نظام الملفات باستخدام استدعاء نظام الإغلاق. يؤدي هذا إلى مسح مخازن الملفات المؤقتة، وتحديث بيانات تعريف الملف ، والتي قد تتضمن مؤشر نهاية الملف في البيانات؛ وإلغاء تخصيص الموارد المرتبطة بالملف (بما في ذلك مُعرّف الملف ) وتحديث جدول الملفات المستخدمة على مستوى النظام. تحتفظ بعض لغات البرمجة ببنية بيانات للملفات التي فتحتها مكتبة وقت التشغيل الخاصة بها ، وقد تُغلق عند إنهاء البرنامج. تُعرف هذه الممارسة باسم " استحواذ الموارد عند التهيئة " (RAII). تستدعي بعض أنظمة التشغيل هذا الاستدعاء closeعلى الملفات التي يحتفظ بها البرنامج عند إنهائه. كما تستدعيه أنظمة تشغيل أخرى closeكجزء من عملية استعادة نظام التشغيل نتيجةً لعطل في النظام.
واجهات C
المكتبة القياسية
توفر مكتبة C القياسية الدالةfclose بالتوقيع [ 1 ]
int fclose ( FILE * stream );يُمثَّل الملف بمؤشر الملف stream، وهو عادةً تجريدٌ لمقبضٍ يعتمد على النظام الأساسي لكائن الملف الأساسي. ولذلك، fcloseيُنفَّذ هذا المؤشر دائمًا تقريبًا كاستدعاء مكتبة، والذي بدوره يُغلق الملف باستخدام استدعاء النظام المُناسب. تُمكِّن طبقة التجريد الإضافية هذه الدالة من البقاء قابلةً للنقل عبر بيئاتٍ مختلفة مع توفير نفس الوظائف. يُعيد الاستدعاء الناجح للدالة fcloseالقيمة صفر، ولكن في حالة حدوث خطأ، تُعيد الدالة قيمةً خاطئة EOF(تُعرَّف عادةً بأنها -1). في كلتا الحالتين، يُضمن فصل مؤشر الملف عن الملف، ويجب عدم استخدامه مرةً أخرى بواسطة أي تطبيق.
بوسيكس
يتضمن معيار POSIX استدعاءclose النظام، المعلن عنه على النحو التالي [ 2 ]
int close ( int fildes );تأخذ الدالة مُعرِّف الملفfildes ، وهو مُعرِّف عددي للملف المفتوح، كمعامل. تسمح هذه الدالة fildesبإعادة استخدام قيمة مُعرِّف الملف للملفات التي تُفتح لاحقًا، وإذا لم يُشر أي مُعرِّف ملف آخر إلى نفس الملف، فسيتم تحرير أي موارد مرتبطة بالملف المفتوح. عند النجاح، closeتُرجع الدالة القيمة صفر. أما في حالة حدوث خطأ، فتُرجع الدالة القيمة -1 وتُسند رمز خطأ مناسبًا إلى المتغير العام errno. في هذه الحالة، تعتمد قيمة مُعرِّف الملف errnoوحالة المتغير fildesجزئيًا على إصدار POSIX الذي يتبعه النظام.
في جميع إصدارات POSIX، errnoتُضبط القيمة على 0 EBADFإذا fildesكان مُعرّف الملف غير صالح. ومن POSIX.1-2001 فصاعدًا، تُضبط على 0 إذا حدث خطأ إدخال/إخراجEIO يعتمد على النظام الأساسي . [ 3 ] حتى POSIX.1-2017، إذا أُرسلت إشارة إلى العملية وقاطعت استدعاء الدالة ، يفشل الاستدعاء مع 0، ويكون وضع مُعرّف الملف غير مُحدد صراحةً في المعيار. [ 4 ] لذا، اعتمادًا على التنفيذ، قد يكون مُعرّف الملف قد أُغلق، وفي هذه الحالة لا ينبغي استدعاء الدالة مرة أخرى. أو قد يظل مُعرّف الملف مفتوحًا، مما يعني أنه يجب استدعاء الدالة مرة أخرى.closeEINTRcloseclose
اعتبر المطورون هذا السلوك غير آمن للتطبيقات المحمولة. على وجه الخصوص، قد يتسبب في حدوث تضارب في العمليات في بيئات متعددة الخيوطclose ، حيث قد يُعاد استخدام مُعرّف الملف في خيط مختلف قبل إعادة المحاولة . [ 5 ] [ 6 ] ولمعالجة هذه المشكلة، يشترط معيار POSIX.1-2024 أنه في حالة مقاطعة استدعاء الدالة close، يمكن أن تنجح الدالة، أو تفشل مع EINTRإبقاء مُعرّف الملف مفتوحًا، أو تفشل مع EINPROGRESSإغلاق مُعرّف الملف. [ 2 ]
مراجع
- ↑ "دالة fclose". ISO/IEC 9899:2011 تكنولوجيا المعلومات - لغات البرمجة - C. جنيف، سويسرا: ISO . 15-12-2011. §7.21.5.1 . تاريخ الاسترجاع: 12-12-2025 .
- 1 2 "close()" . معيار IEEE 1003.1-2024 لتكنولوجيا المعلومات - واجهة نظام التشغيل المحمولة (POSIX®) . مدينة نيويورك، الولايات المتحدة: IEEE . 14-06-2024. الصفحات 745-750 . doi : 10.1109/IEEESTD.2024.10555529 . ISBN 979-8-8557-0793-9تم الاطلاع عليه بتاريخ 28-10-2025 .
- ↑ "close()" . معيار IEEE 1003.1-2001 لتكنولوجيا المعلومات - واجهة نظام التشغيل المحمولة (POSIX®) . المجلد 2: واجهات النظام. مدينة نيويورك، الولايات المتحدة: IEEE . 2001-12-06. الصفحات 203-205 . doi : 10.1109/IEEESTD.2001.93364 . ISBN 978-0-7381-3047-7تم الاطلاع عليه بتاريخ 28-10-2025 .
- ↑ "close()" . معيار IEEE 1003.1-2008 لتكنولوجيا المعلومات - واجهة نظام التشغيل المحمولة (POSIX®) . مدينة نيويورك، الولايات المتحدة: IEEE . 2008-12-01. الصفحات 676-679 . doi : 10.1109/IEEESTD.2008.4694976 . ISBN 978-0-7381-4048-3تم الاطلاع عليه بتاريخ 28-10-2025 .
- ↑ إيدج، جيك (11 ديسمبر 2013). "إرجاع EINTR من دالة close()" . LWN.net . مؤرشف من الأصل بتاريخ 31 أغسطس 2025. تم الاطلاع عليه بتاريخ 12 ديسمبر 2025 .
- ↑ بيرسيفال، كولين (17 ديسمبر 2011). "دالة POSIX close(2) معطلة" . Daemonic Dispatches . مؤرشف من الأصل بتاريخ 13 سبتمبر 2025. تم الاطلاع عليه بتاريخ 12 ديسمبر 2025 .
روابط خارجية
C_Programming/C_Reference/stdio.h/fإغلاق في ويكي الكتب
- مكتبة C POSIX
- استدعاءات النظام
