atexit(3)

الاسم
atexit - تسجيل دالة لاستدعائها عند إنهاء العملية بشكل طبيعي

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

موجز
#include <stdlib.h>

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

الوصف
تسجل دالة atexit() الدالة function المعطاة لاستدعائها عند إنهاء العملية بشكل طبيعي، إما عبر exit(3) أو عبر العودة من main() للبرنامج. تُستدعى الدوال المسجلة هكذا بترتيب عكسي لتسجيلها؛ لا تُمرر أي وسائط.

قد تُسجل نفس الدالة عدة مرات: وتُستدعى مرة واحدة لكل تسجيل.

يتطلب POSIX.1 أن يسمح التطبيق بتسجيل 32 دالة على الأقل من هذا النوع. يمكن الحصول على الحد الفعلي الذي يدعمه التطبيق باستخدام sysconf(3).

عند إنشاء عملية ابنة عبر fork(2)، فإنها ترث نسخًا من تسجيلات والديها. عند إجراء نداء ناجح لإحدى وظائف exec(3)، تُزال كافة التسجيلات.

قيمة الإرجاع
ترجع دالة atexit() القيمة 0 إذا نجحت؛ وإلا، ترجع قيمة غير صفرية.

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

الإصدارات
ينص POSIX.1 على أن نتيجة استدعاء exit(3) أكثر من مرة (أي استدعاء exit(3) داخل دالة مسجلة باستخدام atexit()) غير محددة. في بعض الأنظمة (ولكن ليس لينكس)، قد يؤدي هذا إلى تكرار لا نهائي؛ يجب ألا تستدعي البرامج المنقولة exit(3) داخل دالة مسجلة باستخدام atexit().

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

التاريخ
POSIX.1-2001،‏ C89،‏ C99،‏ SVr4،‏ 4.3BSD.

ملاحظات
لا تُستدعى الدوال المسجلة باستخدام atexit() (و on_exit(3)) إذا أنهيت العملية بشكل غير طبيعي بسبب تسليم إشارة.

إذا استدعت إحدى الدوال المسجلة _exit(2)، فلن تُستدعى أي دوال متبقية، ولن تُنفذ خطوات إنهاء العملية الأخرى التي يؤديها exit(3).

تسجل دالتا atexit() و on_exit(3) الدوال في نفس القائمة: عند إنهاء العملية بشكل طبيعي، تُستدعى الدوال المسجلة بترتيب عكسي لتسجيلها بواسطة هاتين الدالتين.

وفقًا لـ POSIX.1، تكون النتيجة غير محددة إذا استخدم longjmp(3) لإنهاء تنفيذ إحدى الدوال المسجلة باستخدام atexit().

  ملاحظات لينكس
منذ glibc 2.2.3، يمكن استخدام atexit() (و on_exit(3)) داخل مكتبة مشتركة لإنشاء دوال تُستدعى عند تفريغ المكتبة المشتركة.

أمثلة
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>

    static void
    bye(void)
    {
        printf("That was all, folks\n");
    }

    int
    main(void)
    {
        long a;
        int i;

        a = sysconf(_SC_ATEXIT_MAX);
        printf("ATEXIT_MAX = %ld\n", a);

        i = atexit(bye);
        if (i != 0) {
            fprintf(stderr, "cannot set exit function\n");
            exit(EXIT_FAILURE);
        }

        exit(EXIT_SUCCESS);
    }

انظر أيضًا
_exit(2), dlopen(3), exit(3), on_exit(3)

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

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

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