exit(3)

الاسم
exit - تسبب إنهاء عملية عادي

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <stdlib.h>

[[noreturn]] void exit(int status);

الوصف
تسبب دالة exit() إنهاء عملية عادي ويُعاد البايت الأقل أهمية من status (أي status & 0xFF) إلى العملية الأم (انظر wait(2)).

تُستدعى جميع الدوال المسجلة مع atexit(3) و on_exit(3) بترتيب عكس تسجيلها. (من الممكن لإحدى هذه الدوال استخدام atexit(3) أو on_exit(3) لتسجيل دالة إضافية لتنفيذها أثناء معالجة الخروج؛ يُضاف التسجيل الجديد إلى مقدمة قائمة الدوال المتبقية للاستدعاء.) إذا لم تُرجع إحدى هذه الدوال (مثل استدعاء _exit(2) أو قتل نفسها بإشارة)، فلا تُستدعى أي من الدوال المتبقية، ويُهجر المزيد من معالجة الخروج (خاصة تفريغ تدفقات stdio(3)). إذا سُجلت دالة عدة مرات باستخدام atexit(3) أو on_exit(3)، فتُستدعى بعدد مرات تسجيلها.

تُفرغ وتُغلق جميع تدفقات stdio(3) المفتوحة. تُحذف الملفات المنشأة بواسطة tmpfile(3).

يحدد معيار C ثابتين، EXIT_SUCCESS و EXIT_FAILURE، يمكن تمريرهما إلى exit() للإشارة إلى إنهاء ناجح أو غير ناجح على التوالي.

قيمة الإرجاع
لا تُرجع دالة exit() قيمة.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
exit() | سلامة الخيوط | MT-Unsafe race:exit

تستخدم دالة exit() متغيرًا عامًا غير محمي، لذا فهي ليست آمنة للخيوط.

المعايير
C11, POSIX.1-2008.

التاريخ
C89, POSIX.1-2001, SVr4, 4.3BSD.

ملاحظات
السلوك غير محدد إذا استدعت إحدى الدوال المسجلة باستخدام atexit(3) و on_exit(3) إما exit() أو longjmp(3). لاحظ أن استدعاء execve(2) يزيل التسجيلات المنشأة باستخدام atexit(3) و on_exit(3).

استخدام EXIT_SUCCESS و EXIT_FAILURE أكثر قابلية للنقل قليلاً (إلى بيئات غير UNIX) من استخدام 0 وقيمة غير صفرية مثل 1 أو -1. على وجه الخصوص، يستخدم VMS اصطلاحًا مختلفًا.

حاول BSD توحيد رموز الخروج (التي تبنتها بعض مكتبات C مثل مكتبة GNU C أيضًا)؛ انظر الملف <sysexits.h>.

بعد exit()، يجب نقل حالة الخروج إلى العملية الأم. هناك ثلاث حالات:

•   إذا ضبطت العملية الأم SA_NOCLDWAIT، أو ضبطت معالج SIGCHLD على SIG_IGN، تُهمل الحالة وتموت العملية الابنة فورًا.

•   إذا كانت العملية الأم تنتظر العملية الابنة، تُخطر بحالة الخروج وتموت العملية الابنة فورًا.

•   وإلا، تصبح العملية الابنة عملية "زومبي": يُعاد تدوير معظم موارد العملية، لكن يُحتفظ بفتحة تحتوي على معلومات ضئيلة عن العملية الابنة (حالة الإنهاء، إحصائيات استخدام الموارد) في جدول العمليات. يسمح هذا للعملية الأم باستخدام waitpid(2) (أو ما شابه) لاحقًا لمعرفة حالة إنهاء الابنة؛ عند تلك النقطة تُحرر فتحة عملية الزومبي.

إذا دعم التنفيذ إشارة SIGCHLD، تُرسل هذه الإشارة إلى العملية الأم. إذا ضبطت العملية الأم SA_NOCLDWAIT، فمن غير المحدد ما إذا كانت إشارة SIGCHLD تُرسل.

  الإشارات المرسلة إلى عمليات أخرى
إذا كانت العملية الخارجة قائد جلسة وكان طرف التحكم الخاص بها هو طرف التحكم في الجلسة، فتُرسل إشارة SIGHUP إلى كل عملية في مجموعة العمليات الأمامية لطرف التحكم هذا، ويُفصل الطرف عن هذه الجلسة، مما يسمح لعملية تحكم جديدة بالحصول عليه.

إذا تسبب خروج العملية في جعل مجموعة عمليات يتيمة، وإذا كان أي عضو في مجموعة العمليات اليتيمة الجديدة متوقفًا، فسيُرسل إشارة SIGHUP تليها إشارة SIGCONT إلى كل عملية في هذه المجموعة. انظر setpgid(2) لشرح مجموعات العمليات اليتيمة.

باستثناء الحالات المذكورة أعلاه، حيث قد تكون العمليات المُشار إليها أبناء العملية المنتهية، فإن إنهاء العملية لا يُسبب عمومًا إرسال إشارة إلى أبناء تلك العملية. ومع ذلك، يمكن لعملية استخدام عملية prctl(2) PR_SET_PDEATHSIG لترتيب استقبال إشارة إذا انتهت عمليتها الأم.

انظر أيضًا
_exit(2), get_robust_list(2), setpgid(2), wait(2), atexit(3), on_exit(3), tmpfile(3)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.