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

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

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

а также

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

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

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

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

Ответов (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 не находясь на платформе ... это может быть единственным вариантом.

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