Недостатки создания приложения COCOA только для фона в качестве демона запуска?

Существуют ли недостатки создания фонового приложения COCOA без графического интерфейса и запуска его в качестве демона запуска. Это будет использовать:

import <Foundation/Foundation.h>
import <AppKit/AppKit.h>
import <CoreData/CoreData.h>

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

Есть ли недостатки, такие как нарушение функциональности? Будет ли запуск демона отложен?

1 ответ

Решение

Для демона есть серьезные недостатки использования любой не-безопасной среды. Из Технической ноты TN2083: Демоны и агенты - Многослойные структуры:

Слоистые рамки

Большая часть функциональности Mac OS X реализована на больших системных платформах. Многие из этих структур используют службы на основе Mach, которые они ищут с помощью службы начальной загрузки. Это может вызвать всевозможные проблемы, если вы вызываете их из программы, которая ссылается на неправильное пространство имен начальной загрузки.

Решение этой проблемы от Apple заключается в разделении на слои: мы разделяем наши структуры на уровни и для каждого уровня решаем, поддерживает ли этот уровень операции в глобальном пространстве имен начальной загрузки. Основное правило заключается в том, что все в CoreServices и ниже (включая System, IOKit, System Configuration, Foundation) должно работать в любом пространстве имен начальной загрузки (это защитные структуры демона), тогда как для всего, что выше CoreServices (включая ApplicationServices, Carbon и AppKit), требуется пространство имен начальной загрузки графического интерфейса пользователя....

Таким образом, конкретные рекомендации:

  • При написании демона, используйте только ссылки на безопасные для демонов фреймворки (см. Ссылка на фреймворк).

  • При написании агента с графическим интерфейсом вы можете связать с любым фреймворком.

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

Жизнь опасно

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

  • Некоторые фреймворки дают сбой во время загрузки. Таким образом, у инфраструктуры есть подпрограмма инициализации, которая предполагает, что она работает в контексте сеанса, и завершается ошибкой, если это не так.

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

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

    • Рутина может провалиться. Например, подпрограмма может молча завершиться сбоем или распечатать сообщение в stderr, или, возможно, вернуть значимый код ошибки.

    • Рутина может провалиться враждебно. Например, фреймворки GUI довольно часто вызывают abort, если они запускаются демоном!

    • Подпрограмма может работать, даже если ее структура не является официально безопасной для демонов.

    • Процедура может вести себя по-разному в зависимости от своих входных параметров. Например, процедура распаковки изображений может работать для некоторых типов изображений и не работать для других.

  • Поведение любой данной платформы и подпрограмм в этой среде может меняться от выпуска к выпуску.

В результате, если ваш демон связывается с фреймворком, который не является безопасным для демона, вы не можете предсказать, как он будет себя вести в целом. Он может работать на вашем компьютере, но не работать на компьютере другого пользователя, или не работать в будущем выпуске системы, или не работать с другими входными данными. Вы живете в опасности!

Прочитайте весь technote для полных деталей.

Другие вопросы по тегам