الخروج (استدعاء النظام)
في العديد من أنظمة تشغيل الحاسوب ، تُنهي عملية الحاسوب تنفيذها باستدعاء نظام الخروج . وبشكل عام، يعني الخروج في بيئة متعددة الخيوط توقف خيط التنفيذ عن العمل. ولأغراض إدارة الموارد ، يستعيد نظام التشغيل الموارد ( الذاكرة ، الملفات ، إلخ) التي كانت تستخدمها العملية. وتُسمى العملية " عملية ميتة" بعد انتهائها.
كيف يعمل؟
في أنظمة التشغيل يونكس وما يشابهها ، يبدأ تشغيل عملية ما عندما تُنفّذ العملية الأصلية استدعاء النظام fork . قد تنتظر العملية الأصلية انتهاء العملية الفرعية ، أو قد تُواصل التنفيذ (وربما تُنشئ عمليات فرعية أخرى). عند انتهاء العملية الفرعية ("موتها")، سواءً كان ذلك بشكل طبيعي باستدعاء exit ، أو بشكل غير طبيعي نتيجة استثناء أو إشارة خطيرة (مثل SIGTERM أو SIGINT أو SIGKILL )، تُعاد حالة الخروج إلى نظام التشغيل، وتُرسل إشارة SIGCHLD إلى العملية الأصلية. يمكن للعملية الأصلية بعد ذلك استرداد حالة الخروج عبر استدعاء النظام wait .
تسمح معظم أنظمة التشغيل للعملية المُنهية بتحديد حالة خروج معينة للنظام، والتي تُتاح بدورها للعملية الأصلية. عادةً ما تكون هذه الحالة قيمة عددية صحيحة ، مع أن بعض أنظمة التشغيل (مثل Plan 9 من مختبرات بيل ) تسمح بإرجاع سلسلة نصية . تستخدم الأنظمة التي تُرجع قيمة عددية صحيحة عادةً القيمة صفر للدلالة على نجاح التنفيذ، وقيمًا غير صفرية للدلالة على حالات الخطأ. بينما تستخدم أنظمة أخرى (مثل OpenVMS ) قيمًا زوجية للنجاح وقيمًا فردية للأخطاء. وتستخدم أنظمة أخرى (مثل IBM z/OS والإصدارات السابقة لها) نطاقات من القيم العددية الصحيحة للدلالة على نتائج النجاح والتحذير والخطأ.
تنظيف
تُجري عملية الخروج عادةً عمليات تنظيف داخل مساحة العملية قبل إعادة التحكم إلى نظام التشغيل. تسمح بعض الأنظمة ولغات البرمجة بتسجيل إجراءات فرعية للمستخدم بحيث يتم استدعاؤها عند إنهاء البرنامج قبل إنهاء العملية نهائيًا. وكخطوة أخيرة للإنهاء، يتم استدعاء دالة خروج أساسية للنظام، تُعلم نظام التشغيل بأن العملية قد انتهت وتسمح له باستعادة الموارد التي استخدمتها.
في بعض الأحيان، يُمكن تجاوز عملية التنظيف المعتادة؛ إذ توفر لغة C99_exit() دالةً تُنهي العملية الحالية دون أي تنظيف إضافي للبرنامج. يُمكن استخدام هذه الدالة، على سبيل المثال، في روتين fork-exec عندما execيفشل استدعاء الدالة في استبدال العملية الفرعية؛ atexitإذ قد تُحرر هذه الروتينات موارد العملية الأصلية عن طريق الخطأ.
الأيتام والزومبي
تتعامل بعض أنظمة التشغيل مع العمليات الفرعية التي انتهت عملياتها الأصلية بطريقة خاصة. تصبح هذه العملية اليتيمة تابعة لعملية جذرية خاصة ، تنتظر بدورها انتهاء العملية الفرعية. وبالمثل، تُستخدم استراتيجية مماثلة للتعامل مع العمليات المعلقة ، وهي عمليات فرعية انتهت ولكن تتجاهل عمليتها الأصلية حالة خروجها. تصبح هذه العملية تابعة لعملية أصلية خاصة، تسترجع حالة خروج العملية الفرعية وتسمح لنظام التشغيل بإكمال إنهاء العملية المتوقفة. يُحافظ التعامل مع هذه الحالات الخاصة على اتساق جدول عمليات النظام.
أمثلة
تقوم البرامج التالية بالإنهاء وإرجاع حالة خروج ناجحة إلى النظام.
ج :
| لغة سي++ : استيراد std ؛int main () { std :: exit ( 0 ); // أو return 0 } |
كوبول :
قسم التعريف . معرف البرنامج . برنامج النجاح . قسم الإجراءات . الرئيسي . نقل الصفر إلى رمز الإرجاع . نهاية البرنامج .فورتران :
برنامج ويكي استدعاء الخروج ( 0 ) نهاية برنامج ويكيجافا :
public class Example { public static void main ( String [] args ) { System . exit ( 0 ); } }جافا سكريبت ( نود.جي إس ):
process.exit ( 0 ) ;باسكال :
برنامج ويكي ؛ ابدأ رمز الخروج := 0 ؛ خروج نهاية .مخرج 0 بيرل :
#!/usr/bin/env perl exit ;PHP :
<?php exit ( 0 );بايثون :
#!/usr/bin/env python3 import sysإذا كان __name__ يساوي " __main__ " : sys.exit ( 0 )الصدأ :
استخدم std :: process ؛fn main () { process :: exit ( 0 ); }مخرج 0لغة التجميع 16 بت لأجهزة الكمبيوتر الشخصية المتوافقة مع IBM:
؛ لـ MASM / TASM .موديل صغير .كومة .شفرة الإجراء الرئيسي بالقرب من MOV AH, 4Ch ; خدمة 4Ch - إنهاء مع رمز الخطأ MOV AL, 0 ; رمز الخطأ INT 21h ; مقاطعة 21h - مقاطعات DOS العامة نقطة النهاية الرئيسية نهاية البرنامج الرئيسي؛ يبدأ من البرنامج الرئيسي
قد يقوم بعض المبرمجين بإعداد كل شيء لـ INT 21h دفعة واحدة:
MOV AX, 4C00h ; استبدل 00 برمز الخطأ الخاص بك بصيغة HEX
لغة التجميع لنظام لينكس 32 بت x86 :
; لـ NASM MOV AL, 1 ; الدالة 1: exit() MOV EBX, 0 ; رمز الإرجاع INT 80h ; # يمرر التحكم إلى متجه المقاطعة # يستدعي استدعاء النظام — في هذه الحالة استدعاء النظام # رقم 1 مع الوسيط 0
للغاز .نص .global _start _يبدأ: movl $1, %eax # استدعاء النظام رقم 1: exit() movl $0, %ebx # الخروج بحالة خروج 0 int $0x80 # تمرير التحكم إلى متجه المقاطعة # يستدعي استدعاء النظام —في هذه الحالة استدعاء النظام # رقم 1 مع الوسيط 0
لغة التجميع لنظام لينكس 64 بت x86 64 : لـ FASM
تنسيق ملف تنفيذي ELF64 ، بداية المقطع قابلة للقراءة، بداية الملف التنفيذي : ; STUFF ; الخروج mov eax , 60 ; sys_exit رقم استدعاء النظام: 60 xor edi , edi ; تعيين حالة الخروج إلى 0 (`xor edi, edi` يساوي `mov edi, 0`) syscall ; استدعاؤهنظام التشغيل OS X 64 بت x86 64 لغة التجميع: لـ NASM
global _mainنص القسم_main: mov rax , 0x02000001 ; sys_exit رقم استدعاء النظام: 1 (أضف 0x02000000 لنظام التشغيل OS X) xor rdi , rdi ; تعيين حالة الخروج إلى 0 (`xor rdi, rdi` يساوي `mov rdi, 0`) syscall ; استدعاء exit()ويندوز
في نظام التشغيل ويندوز، يمكن للبرنامج إنهاء نفسه عن طريق استدعاء الدالة ExitProcessأو RtlExitUserProcessالدالة.
انظر أيضاً
مراجع
- ^ بول ماتياس ر. (30/07/1997) [01/05/1994]. "II.4. Undokumentierte Eigenschaften externer Kommandos" [ الخصائص غير الموثقة للأوامر الخارجية ] . NWDOS-TIPs — نصائح وحيل لتشغيل Novell DOS 7، مع النقر على التفاصيل والأخطاء والحلول البديلة [ نصائح وحيل لـ Novell DOS 7، مع التركيز على التفاصيل غير الموثقة والأخطاء والحلول البديلة ] . MPDOSTIP. NWDOSTIP.TXT، الإصدار 3، الإصدار 157 (باللغة الألمانية). مؤرشفة من الأصلي بتاريخ 2016-11-05 . تم الاسترجاع 2012/01/11 .(ملاحظة هامة:
NWDOSTIP.TXTهذا عمل شامل حول نظامي التشغيل نوفيل دوس 7 وأوبن دوس 7.01 ، ويتضمن وصفًا للعديد من الميزات والتفاصيل الداخلية غير الموثقة. وهو جزء منMPDOSTIP.ZIPمجموعة المؤلف الأكبر حجمًا التي تم الاحتفاظ بها حتى عام 2001 وتوزيعها على العديد من المواقع في ذلك الوقت. يشير الرابط المرفق إلى نسخة أقدم من الملف تم تحويلها إلى صيغة HTML.)
روابط خارجية
- إنهاء عملية - مرجع واجهات النظام، مواصفات يونكس الموحدة ، الإصدار 5 من مجموعة Open Group
- مرجع C++ لـ
std::exit
- مكتبة C القياسية
- عملية (حوسبة)
- بوسيكس
- البرامج الفرعية
