Вопросы | c

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

Вопрос

Nathan Fellman | 7954 просмотров | рейтинг: 4

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

    int on_exit(void (*function)(int , void *), void *arg);
 
а также
    int atexit(void (*function)(void));
 
кроме того факта, что функция, используемая on_exit, получает статус выхода? То есть, если меня не волнует статус выхода, есть ли причина использовать один или другой? Изменить: Многие ответы предупреждают против on_exit, потому что это нестандартно. Если я разрабатываю приложение, предназначенное для внутреннего корпоративного использования и гарантированно работающее на определенных конфигурациях, стоит ли мне беспокоиться об этом?



Ответы

Mike Stone

+ 17 -
Вы должны использовать atexit(), если это возможно. on_exit() является нестандартным и менее распространенным. Например, это не доступно на OS X. Kernel.org - on_exit():
  Эта функция взята из SunOS 4, но также присутствует в libc4, libc5 и   Glibc. Это больше не происходит в Solaris (SunOS 5). Избегайте этой функции, и   используйте вместо этого стандартный atexit (3).
 


Derek Park

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


R..

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


Anonymous

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


Anonymous

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


Теги

c | linux