ومن المعروف أن شوكة() يتم استخدام استدعاء النظام لإنشاء عملية جديدة تصبح تابعة لعملية المتصل.
عند الخروج، يترك الطفل حالة الخروج التي يجب إعادتها إلى ولي الأمر. لذلك عندما ينتهي الطفل يصبح غيبوبة .
عند خروج الطفل أو توقفه، يتم إرسال رسالة إلى ولي الأمر سيجتشلد إشارة.
يمكن للوالد استخدام استدعاء النظام wait() أو waitpid() مع وحدات الماكرو WIFEXITED وWEXITSTATUS معها للتعرف على حالة الطفل المتوقف.
(*)wait() استدعاء النظام: يوقف تنفيذ عملية الاستدعاء حتى ينتهي أحد أبنائها.
بناء جملة استدعاء النظام wait():
pid_t wait(int *status);
(*) استدعاء النظام waitpid() : يقوم بتعليق تنفيذ عملية الاستدعاء حتى يتغير حالة الطفل المحدد بواسطة وسيطة pid.
بناء جملة استدعاء النظام waitpid():
pid_t waitpid(pid_t pid int *status int options)
ملاحظة: بشكل افتراضي، ينتظر waitpid() فقط للأطفال الذين تم إنهاؤهم ولكن هذا السلوك قابل للتعديل عبر وسيطة الخيارات مثل WIFEXITED WEXITSTATUS وما إلى ذلك.
يمكن أن تكون قيمة pid:
- أقل من -1: يعني الانتظار لأي عملية فرعية يكون معرف مجموعة العمليات الخاصة بها مساويًا للقيمة المطلقة لـ pid.
- يساوي -1 : يعني انتظر أي عملية فرعية.
- يساوي 0: يعني انتظار أي عملية فرعية يكون معرف مجموعة العمليات الخاصة بها مساويًا لمعرف عملية الاستدعاء.
- أكبر من 0: يعني انتظار الطفل الذي يساوي معرف العملية الخاص به قيمة pid.
WIFEXITED وWEXITSTATUS هما من الخيارات التي يمكن استخدامها لمعرفة حالة خروج الطفل.
WIFEXITED(status) : يُرجع صحيحًا إذا تم إنهاء الطفل بشكل طبيعي.
WEXITSTATUS(status): يُرجع حالة خروج الطفل. يجب استخدام هذا الماكرو فقط إذا تم إرجاع WIFEXITED إلى القيمة true.
يوجد أدناه تطبيق C الذي يستخدمه الطفل إكسكل () الدالة ولكن المسار المحدد لـ execl () غير محدد.
دعونا نرى ما هي قيمة حالة الخروج للطفل الذي يحصل عليه الوالد.
// C code to find the exit status of child process #include #include #include #include #include // Driver code int main(void) { pid_t pid = fork(); if ( pid == 0 ) { /* The pathname of the file passed to execl() is not defined */ execl('/bin/sh' 'bin/sh' '-c' './nopath' NULL); } int status; waitpid(pid &status 0); if ( WIFEXITED(status) ) { int exit_status = WEXITSTATUS(status); printf('Exit status of the child was %dn' exit_status); } return 0; }
الإخراج:

ملحوظة : قد لا يعمل الكود أعلاه مع المترجم عبر الإنترنت حيث تم تعطيل fork().
هنا حالة الخروج هي 127 مما يشير إلى وجود مشكلة ما في المسار أو وجود خطأ مطبعي.
تم إدراج عدد قليل من رموز حالة الخروج أدناه للحصول على معلومات إضافية:
- 1 : أخطاء متنوعة مثل القسمة على صفر وغيرها من العمليات غير المسموح بها.
-
2: مشكلة الكلمة الأساسية أو الأمر أو الإذن مفقودة. - 126 : مشكلة الإذن أو الأمر غير قابل للتنفيذ
- 128 : وسيطة غير صالحة للخروج.
ملاحظة: لا يحدد معيار C معنى رموز الإرجاع. تختلف قواعد استخدام رموز الإرجاع باختلاف الأنظمة الأساسية.