2012-05-22 2 views
2

Есть несколько руководств что объясняет использование atexit() функции, такие как:atexit() функция

http://linux.die.net/man/3/atexit

Примеры приведены в основной функции, которые могут быть легко поняты. Тем не менее, я создаю общую библиотеку в своей программе, и я предоставляю некоторые функции для экспорта из других программ. Я хочу остановить некоторые потоки внутри разделяемой библиотеки, когда другая программа выгружает мою общую библиотеку. Как я могу использовать atexit() в моей реализации общей библиотеки, не заставляя пользователей называть какую-либо функцию, например. destroy() в конце?

Заранее спасибо.

+0

at есть небезопасный. –

ответ

7

В documentation состоянии:

Поскольку Glibc 2.2.3, atexit() (и on_exit (3)), может быть использовано в пределах общей библиотеки установить функции, которые вызываются, когда общая библиотеки выгружен.

С другой стороны, почему бы вам просто не сделать объект глобального масштаба и не выполнить свой код в своем деструкторе?

6

Вам следует избегать этого (если вы действительно не должны по какой-то действительно сильной причине).

lib должен просто предоставить функции и позволить приложению свободно использовать его. Если ваша библиотека экспортирует функцию, которая запускает некоторые вспомогательные потоки, также предоставляйте функцию, чтобы остановить ее и соответствующим образом документировать. Следите за тем, чтобы приложение не освобождало ресурсы.

Если у вас есть идея исправить багги-программы, вызывающие некоторые lib_init(), но забудьте lib_uninit(), а затем забудьте об этом. Это сделает вас более сложным и вы никогда не сможете исправить все возможные ошибки приложения. программист может создавать, и отладка такого приложения будет сложнее.

IMHO, библиотеки должны (насколько это возможно) избегать изменения некоторых глобальных процессов, потому что такие библиотеки вызывают ограничения в отношении того, как приложение может быть спроектировано. Такие библиотеки - кошмар, особенно если вы связываетесь с несколькими, и у них есть противоречивые предположения о том, как писать приложение.

+0

@bugra +1 Согласен с оценкой mity. Если программа (во время нормальной работы) выгружает вашу библиотеку, то 'atexit()' явно не является подходящей функцией для вызова (это для нормального завершения программы). Вызов функции должен выполняться из основной программы в вашу библиотеку, чтобы сообщить ей о выпуске своих ресурсов до ее выгрузки. –

Смежные вопросы