Есть ли разница между функциями on_exit () и atexit ()? - PullRequest
19 голосов
/ 14 августа 2008

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

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

и

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

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

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

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

Ответы [ 5 ]

17 голосов
/ 14 августа 2008

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

Kernel.org - on_exit():

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

14 голосов
/ 14 августа 2008

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

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

4 голосов
/ 18 июля 2010

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

1 голос
/ 14 августа 2008

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

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

0 голосов
/ 14 августа 2008

@ Nathan

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...