/* * exit.c * * exit(), including the handling of the atexit chain. */ #include #include #include #include "atexit.h" /* Link chain for atexit/on_exit */ struct atexit *__atexit_list; void exit(int rv) { struct atexit *ap; for (ap = __atexit_list; ap; ap = ap->next) { /* This assumes extra args are harmless. They should be in all normal C ABIs, but if an architecture has some particularly bizarre ABI this might be worth watching out for. */ ap->fctn(rv, ap->arg); } /* Handle any library destructors if we ever start using them... */ _exit(rv); }