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

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

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

и

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

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

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

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

14.08.2008 04:53:45
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

14
14.08.2008 05:03:17

Вы должны использовать, atexit()если это возможно. on_exit()является нестандартным и менее распространенным. Например, это не доступно в OS X.

Kernel.org - on_exit():

Эта функция взята из SunOS 4, но также присутствует в libc4, libc5 и glibc. Это больше не происходит в Solaris (SunOS 5). Избегайте этой функции и используйте вместо этого стандартный atexit (3).

18
14.08.2008 04:59:55

@Натан

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

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

0
14.08.2008 06:51:23

@ Натан, я не могу найти функцию, которая будет возвращать код завершения текущего запущенного процесса. Я ожидаю, что он все еще не установлен в точке, когда atexit()вызывается. Под этим я подразумеваю, что среда выполнения знает, что это такое, но, вероятно, не сообщила об этом ОС. Впрочем, это всего лишь предположение.

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

1
14.08.2008 08:09:47

Разница в том, что atexitэто C и on_exitэто какое-то странное расширение, доступное в GNU и Unixy-системах кто-знает-что-что (но НЕ является частью POSIX).

4
17.07.2010 20:20:53