Есть ли разница между функциями on_exit() и atexit()?
Есть ли разница между
int on_exit(void (*function)(int , void *), void *arg);
и
int atexit(void (*function)(void));
кроме того, что функция, используемая on_exit, получает статус выхода?
То есть, если я не забочусь о статусе выхода, есть ли какая-то причина использовать тот или иной?
Изменить:. Многие ответы были предупреждены против on_exit
, поскольку он нестандартен. Если я разрабатываю приложение, предназначенное для внутреннего корпоративного использования и гарантированное выполнение определенных конфигураций, я должен беспокоиться об этом?
Ответы
Ответ 1
В соответствии с эта ссылка Я нашел, кажется, есть несколько отличий. on_exit
позволит вам передать аргумент, который передается функции on_exit
, когда он вызывается..., который может позволить вам настроить некоторые указатели, чтобы выполнить некоторую очистку, когда пришло время выхода.
Кроме того, похоже, что on_exit
была специфичной для SunOS функцией, которая может быть не совместима со всеми платформами... поэтому вы можете захотеть придерживаться atexit, несмотря на то, что это более ограничительное.
Ответ 2
При необходимости используйте atexit()
. on_exit()
является нестандартным и менее распространенным. Например, он недоступен в OS X.
Kernel.org - on_exit()
:
Эта функция исходит от SunOS 4, но также присутствует в libc4, libc5 и Glibc. Это больше не происходит в Solaris (SunOS 5). Избегайте этой функции и вместо этого используйте стандартный atexit (3).
Ответ 3
Разница в том, что atexit
есть C и on_exit
- это какое-то странное расширение, доступное в GNU и who-know-what-other Unixy-системах (но НЕ часть POSIX).
Ответ 4
@Nathan, я не могу найти какую-либо функцию, которая вернет код выхода для текущего текущего процесса. Я ожидаю, что он еще не установлен в момент, когда atexit()
вызывается, так или иначе. Под этим я подразумеваю, что среда выполнения знает, что это такое, но, вероятно, не сообщила об этом ОС. Это в значительной степени просто гипотеза.
Похоже, вам нужно будет использовать on_exit()
или структурировать свою программу, чтобы код выхода не имел значения. Было бы неразумно иметь последнее утверждение в вашей основной функции, перевернуть глобальную переменную exited_cleanly
в значение true. В функции, которую вы регистрируете с помощью atexit()
, вы можете проверить эту переменную, чтобы определить, как вышла программа. Это даст вам только два состояния, но я ожидаю, что этого будет достаточно для большинства потребностей. Вы также можете расширить этот тип схемы, чтобы при необходимости поддерживать больше состояний выхода.
Ответ 5
@Натан
Во-первых, посмотрите, есть ли другой вызов API для определения статуса выхода... быстрый взгляд, и я его не вижу, но я не хорошо разбираюсь в стандартном C API.
Легкой альтернативой является наличие глобальной переменной, которая сохраняет статус выхода... по умолчанию это неизвестная причина ошибки (если программа заканчивается ненормально). Затем, когда вы вызываете exit, вы можете сохранить статус выхода в глобальном и извлечь его из любых функций atexit. Это требует тщательного хранения статуса выхода перед каждым вызовом выхода и явно не идеально, но если API отсутствует, и вы не хотите рисковать on_exit
, не находясь на платформе... это может быть единственный вариант.