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