Есть ли разница между
int on_exit(void (*function)(int , void *), void *arg);
и
int atexit(void (*function)(void));
кроме того, что функция, используемая on_exit, получает статус выхода?
То есть, если мне не важен статус выхода, есть ли причина использовать ту или иную функцию?
Редактирование: Многие ответы предостерегают от on_exit
, потому что он нестандартный. Если я разрабатываю приложение для внутреннего корпоративного использования, которое гарантированно будет работать на определенных конфигурациях, стоит ли мне беспокоиться об этом?
По возможности следует использовать atexit()
. on_exit()
является нестандартным и менее распространенным. Например, она недоступна в OS X.
Kernel.org - on_exit()
:
Эта функция пришла из SunOS 4, но также присутствует в libc4, libc5 и glibc. Она больше не встречается в Solaris (SunOS 5). Избегайте этой функции и используйте вместо нее стандартную atexit(3).
Согласно этой ссылке, которую я нашел, кажется, есть несколько различий. on_exit
позволит вам передать аргумент, который будет передан в функцию on_exit
при ее вызове... что может позволить вам установить некоторые указатели для выполнения некоторой работы по очистке, когда придет время выйти.
Более того, похоже, что on_exit
была специфической функцией SunOS, которая может быть несовместима со всеми платформами... так что, возможно, вы захотите использовать atexit, несмотря на его более жесткие ограничения.
@Nathan, я can' t находят любую функцию, которая возвратит код завершения для текущего бегущего процесса. Я ожидаю что это isn' t набор все же в пункте, когда 'atexit ()' назван, так или иначе. Этим я подразумеваю, что время выполнения знает, каково это, но вероятно hasn' t сообщил о нем OS. Это - в значительной степени просто догадка, все же.
Похоже, что Вы должны будете или использовать 'on_exit ()' или структурировать свою программу так, чтобы код завершения doesn' t вопрос. Не было бы неблагоразумно иметь последнее заявление в Вашем главном щелчке функции глобальная 'exited_cleanly' переменная к истинному. В функции Вы регистрируетесь в 'atexit ()', Вы могли проверить эту переменную, чтобы определить, как программа вышла. Это только даст Вам два государства, но я ожидаю, что это было бы достаточно для большинства потребностей. Вы могли также расширить этот тип схемы поддержать больше выходных государств при необходимости.
@Nathan
Во-первых, посмотрите, есть ли другой вызов API для определения статуса выхода... беглый взгляд и я не вижу ни одного, но я не очень хорошо разбираюсь в стандартном API C.
Простая альтернатива - иметь глобальную переменную, которая хранит статус выхода... по умолчанию это неизвестная причина ошибки (если программа завершается ненормально). Затем, когда вы вызываете exit, вы можете хранить статус выхода в глобальной переменной и получать его из любых функций atexit. Это требует тщательного хранения статуса выхода перед каждым вызовом exit, и, конечно, не идеально, но если нет API и вы не хотите рисковать отсутствием on_exit
в платформе... это может быть единственным вариантом.