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

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

   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).

Комментарии (0)
Решение

Согласно этой ссылке, которую я нашел, кажется, есть несколько различий. on_exit позволит вам передать аргумент, который будет передан в функцию on_exit при ее вызове... что может позволить вам установить некоторые указатели для выполнения некоторой работы по очистке, когда придет время выйти.

Более того, похоже, что on_exit была специфической функцией SunOS, которая может быть несовместима со всеми платформами... так что, возможно, вы захотите использовать atexit, несмотря на его более жесткие ограничения.

Комментарии (0)

Различие - то, что 'atexit' - C, и 'on_exit' - некоторое странное расширение, доступное на ГНУ и кто знает что другие системы Unixy (но НЕ часть POSIX).

Комментарии (0)

@Nathan, я can' t находят любую функцию, которая возвратит код завершения для текущего бегущего процесса. Я ожидаю что это isn' t набор все же в пункте, когда 'atexit ()' назван, так или иначе. Этим я подразумеваю, что время выполнения знает, каково это, но вероятно hasn' t сообщил о нем OS. Это - в значительной степени просто догадка, все же.

Похоже, что Вы должны будете или использовать 'on_exit ()' или структурировать свою программу так, чтобы код завершения doesn' t вопрос. Не было бы неблагоразумно иметь последнее заявление в Вашем главном щелчке функции глобальная 'exited_cleanly' переменная к истинному. В функции Вы регистрируетесь в 'atexit ()', Вы могли проверить эту переменную, чтобы определить, как программа вышла. Это только даст Вам два государства, но я ожидаю, что это было бы достаточно для большинства потребностей. Вы могли также расширить этот тип схемы поддержать больше выходных государств при необходимости.

Комментарии (0)

@Nathan

Во-первых, посмотрите, есть ли другой вызов API для определения статуса выхода... беглый взгляд и я не вижу ни одного, но я не очень хорошо разбираюсь в стандартном API C.

Простая альтернатива - иметь глобальную переменную, которая хранит статус выхода... по умолчанию это неизвестная причина ошибки (если программа завершается ненормально). Затем, когда вы вызываете exit, вы можете хранить статус выхода в глобальной переменной и получать его из любых функций atexit. Это требует тщательного хранения статуса выхода перед каждым вызовом exit, и, конечно, не идеально, но если нет API и вы не хотите рисковать отсутствием on_exit в платформе... это может быть единственным вариантом.

Комментарии (0)