Что вы называете "нормальным завершением"?
Unix и C99 имеют функции _Exit (как POSIX и C99), так и _exit (только POSIX), которые позволяют завершать программу с любым состоянием, которое вы хотите, и без запуска обработчиков atexit. Другие известные мне случаи, когда они не выполняются, все явно терпят неудачу в "ненормальном завершении".