Подтвердить что ты не робот

Есть ли разница между функциями on_exit() и atexit()?

Есть ли разница между

   int on_exit(void (*function)(int , void *), void *arg);

и

   int atexit(void (*function)(void));

кроме того, что функция, используемая on_exit, получает статус выхода?

То есть, если я не забочусь о статусе выхода, есть ли какая-то причина использовать тот или иной?

Изменить:. Многие ответы были предупреждены против on_exit, поскольку он нестандартен. Если я разрабатываю приложение, предназначенное для внутреннего корпоративного использования и гарантированное выполнение определенных конфигураций, я должен беспокоиться об этом?

4b9b3361

Ответ 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, не находясь на платформе... это может быть единственный вариант.