[support.start.term] (original) (raw)
17 Language support library [support]
17.5 Startup and termination [support.start.term]
[ Note
:
The header <cstdlib> ([cstdlib.syn]) declares the functions described in this subclause.
— end note
]
[[noreturn]] void _Exit(int status) noexcept;
Effects:This function has the semantics specified in the C standard library.
Remarks:The program is terminated without executing destructors for objects of automatic, thread, or static storage duration and without calling functions passed toatexit() ([basic.start.term]).
[[noreturn]] void abort() noexcept;
Effects:This function has the semantics specified in the C standard library.
Remarks:The program is terminated without executing destructors for objects of automatic, thread, or static storage duration and without calling functions passed toatexit() ([basic.start.term]).
int atexit(c-atexit-handler* f) noexcept;int atexit(atexit-handler* f) noexcept;
Effects:Theatexit()functions register the function pointed to by fto be called without arguments at normal program termination.
It is unspecified whether a call to atexit() that does nothappen beforea call to exit() will succeed.
Implementation limits:The implementation shall support the registration of at least 32 functions.
Returns:Theatexit()function returns zero if the registration succeeds, nonzero if it fails.
[[noreturn]] void exit(int status);
Effects:
- First, objects with thread storage duration and associated with the current thread are destroyed. Next, objects with static storage duration are destroyed and functions registered by callingatexitare called.211See [basic.start.term] for the order of destructions and calls. (Objects with automatic storage duration are not destroyed as a result of callingexit().)212If control leaves a registered function called by exit because the function does not provide a handler for a thrown exception, the function std::terminate shall be called ([except.terminate]).
- Next, all open C streams (as mediated by the function signatures declared in <cstdio> ([cstdio.syn])) with unwritten buffered data are flushed, all open C streams are closed, and all files created by callingtmpfile() are removed.
- Finally, control is returned to the host environment. If status is zero orEXIT_SUCCESS, an implementation-defined form of the statussuccessful terminationis returned. If status isEXIT_FAILURE, an implementation-defined form of the statusunsuccessful terminationis returned. Otherwise the status returned is implementation-defined.213
int at_quick_exit(c-atexit-handler* f) noexcept;int at_quick_exit(atexit-handler* f) noexcept;
Effects:The at_quick_exit() functions register the function pointed to by fto be called without arguments when quick_exit is called.
It is unspecified whether a call to at_quick_exit() that does nothappen beforeall calls to quick_exit will succeed.
[ Note
:
Theat_quick_exit() functions do not introduce a data race ([res.on.data.races]).
— end note
]
[ Note
:
The order of registration may be indeterminate if at_quick_exit was called from more than one thread.
— end note
]
[ Note
:
Theat_quick_exit registrations are distinct from the atexit registrations, and applications may need to call both registration functions with the same argument.
— end note
]
Implementation limits:The implementation shall support the registration of at least 32 functions.
Returns:Zero if the registration succeeds, nonzero if it fails.
[[noreturn]] void quick_exit(int status) noexcept;
Effects:Functions registered by calls to at_quick_exit are called in the reverse order of their registration, except that a function shall be called after any previously registered functions that had already been called at the time it was registered.
Objects shall not be destroyed as a result of calling quick_exit.
If control leaves a registered function called by quick_exit because the function does not provide a handler for a thrown exception, the function std::terminate shall be called.
[ Note
: A function registered via at_quick_exitis invoked by the thread that calls quick_exit, which can be a different thread than the one that registered it, so registered functions should not rely on the identity of objects with thread storage duration. — end note
]
After calling registered functions, quick_exit shall call _Exit(status).
Remarks: The function quick_exit is signal-safewhen the functions registered with at_quick_exit are.
See also: ISO C 7.22.4