هل هناك فرق بين الدالتين on_exit() و atexit()؟

StackOverflow https://stackoverflow.com/questions/10680

  •  08-06-2019
  •  | 
  •  

سؤال

هل هناك فرق بين

   int on_exit(void (*function)(int , void *), void *arg);

و

   int atexit(void (*function)(void));

بخلاف حقيقة أن الوظيفة التي يستخدمها on_exit تحصل على حالة الخروج؟

بمعنى، إذا كنت لا أهتم بحالة الخروج، فهل هناك أي سبب لاستخدام واحدة أو أخرى؟

يحرر: العديد من الإجابات حذرت منها on_exit لأنه غير قياسي.إذا كنت أقوم بتطوير تطبيق مخصص للاستخدام الداخلي للشركة ويضمن تشغيله على تكوينات محددة، فهل يجب أن أقلق بشأن هذا الأمر؟

هل كانت مفيدة؟

المحلول

وفق هذا الرابط لقد وجدت، يبدو أن هناك بعض الاختلافات. on_exit سيسمح لك بالمرور في الوسيطة التي تم تمريرها إلى on_exit الدالة عندما يتم استدعاؤها ...مما قد يتيح لك إعداد بعض المؤشرات للقيام ببعض أعمال التنظيف عندما يحين وقت الخروج.

علاوة على ذلك، يبدو أن on_exit كانت وظيفة خاصة بنظام التشغيل SunOS وقد لا تكون متوافقة مع جميع الأنظمة الأساسية...لذلك قد ترغب في الالتزام بـ atexit، على الرغم من كونه أكثر تقييدًا.

نصائح أخرى

يجب عليك استخدام atexit() إذا كان ذلك ممكنا. on_exit() غير قياسي وأقل شيوعا.على سبيل المثال، فهو غير متوفر على نظام التشغيل OS X.

كيرنل.أورج - on_exit():

تأتي هذه الوظيفة من Sunos 4 ، ولكنها موجودة أيضًا في Libc4 و Libc5 و Glibc.لم يعد يحدث في سولاريس (SunOS 5).تجنب هذه الوظيفة ، واستخدم atexit القياسية (3) بدلاً من ذلك.

الفرق هو ذلك atexit هو ج و on_exit هو امتداد غريب متاح على GNU وأنظمة Unixy الأخرى التي يعرفها (لكن لا جزء من بوسيكس).

@ ناثان، لا يمكنني العثور على أي وظيفة تقوم بإرجاع رمز الخروج لعملية التشغيل الحالية.أتوقع أنه لم يتم تحديده بعد عند هذه النقطة atexit() ويسمى، على أي حال.أعني بهذا أن وقت التشغيل يعرف ما هو عليه، ولكن ربما لم يبلغ عنه إلى نظام التشغيل.هذا إلى حد كبير مجرد تخمين، على أية حال.

يبدو أنك ستحتاج إما إلى الاستخدام on_exit() أو قم ببناء برنامجك بحيث لا يهم رمز الخروج.لن يكون من غير المعقول أن يكون البيان الأخير في وظيفتك الرئيسية يقلب عالميًا exited_cleanly متغير إلى صحيح.في الوظيفة التي قمت بالتسجيل بها atexit(), يمكنك التحقق من هذا المتغير لتحديد كيفية خروج البرنامج.وهذا سوف يعطيك دولتين فقط، ولكن أتوقع أن يكون ذلك كافيا لمعظم الاحتياجات.يمكنك أيضًا توسيع هذا النوع من المخطط لدعم المزيد من حالات الخروج إذا لزم الأمر.

@ ناثان

أولاً، تحقق مما إذا كان هناك استدعاء آخر لواجهة برمجة التطبيقات (API) لتحديد حالة الخروج...نظرة سريعة ولا أرى واحدة، ولكني لست على دراية جيدة بواجهة برمجة تطبيقات C القياسية.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top