2010-08-05 3 views
2

В моем приложении Cocoa мне нужно запустить задачу, которая использует нестабильный нефиксируемый код. Он мало вводит, работает независимо от остальной части приложения и генерирует в результате тысячи объектов ObjC.Приложение для защиты от кавычек от кражи

Как я могу запустить нестабильную часть и позволить ей сбой, не снимая всего приложения?

Возможно ли до fork() Какао-приложение? Как UI, потоки, GC, KVO, runloops будут вести себя при раздвоении?

Могу ли я избежать создания автономного исполняемого файла, запущенного через NSTask?

Если я запускаю отдельный процесс, как я могу отправлять и получать экземпляры объектов ObjC? (Я бы предпочел не сериализовать/нестиализировать их самостоятельно, и мне нужно сохранить их после завершения дочернего процесса).

Как OS X справляется с этой проблемой для плагинов Spotlight и Quicklook?

+3

Почему это неустойчиво и неустойчиво? Зачем вам использовать такую ​​программу? Почему вы не можете сделать его стабильным? Возможно, вы задаете неправильный вопрос, может быть, не должно быть «как я могу скомпрометировать свое приложение?» и, возможно, это должно быть «как я могу исправить этот неустойчивый код?». – Jasarien

+2

Пожалуйста, просто предположите, что код нефиксирован. Я не хочу обсуждать свои причины здесь. Я думаю, что решение может быть интересно и другим пользователям, которым, возможно, придется работать с сторонними плагинами, библиотеками с закрытыми исходными кодами или нуждаться в совместимости со старыми API-интерфейсами ОС, которые являются шероховатыми. – Kornel

ответ

2

Можно ли использовать вилку() для какао?

Да, но вы в значительной степени должны выполнить exec немедленно. Core Foundation будет генерировать исключение, если вы попытаетесь использовать определенные методы Cocoa или CF-функции между fork и exec (или вообще не выполняете execking). Вы могли бы уйти от некоторых вещей (например, я мог спросить окно его фрейм), но ничего не безопасно.

Запуск NSTask, конечно, считается как fork и exec вместе, предотвращая проблемы пропусков или отсрочки exec.

Как UI, резьба, GC, KVO, runloops будут вести себя при раздвоении?

UI: Windows (фактические на экране) не дублируются. Конечно, вы не можете разговаривать со своими объектами NSWindow и NSView.

Темы: Не переносится на подпроцесс. This is not as good as it may sound, поскольку проблемных случаев предостаточно; для одного, другой поток мог иметь замок в родительском элементе, который остается заблокированным в дочернем элементе, хотя нить, которая его удерживала, отсутствует.

GC: Ну, сборщик мусора работает на волоске ...

КВО: Должно быть хорошо, так как наблюдение, как правило, срабатывает либо явно, либо KVO поставляемыми оберток аксессорах.

Пробег: по одному на поток, поэтому цикл выполнения основного потока все еще существует, но он умрет, если вы вернетесь к нему.

Могу ли я избежать создания автономного исполняемого файла, запущенного через NSTask?

Nope.

Если я запускаю отдельный процесс, как я могу отправлять и получать экземпляры объектов ObjC?

Если вы не выполняете, вы этого не сделаете.

В противном случае вы можете использовать DO.

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

Затем вам нужно будет сделать копию в родительском процессе. Я не знаю, можете ли вы использовать copyWithZone:; возможно нет. Я подозреваю, что вам придется делать какую-то сериализацию/unserialization на основе plist или архива.

Как OS X справляется с этой проблемой для плагинов Spotlight и Quicklook?

Spotlight имеет mdworker; У Quick Look есть нечто похожее.

+0

Также. . posix_spawn() - современная альтернатива fork/exec. Я думаю, что NSTask использует его внутренне. – neoneye

+0

Спасибо за подробный ответ. Итак, чтобы подвести итог: 'NSTask' +' NSKeyedArchiver' - это путь? – Kornel

+2

Я бы так сказал. Обратите внимание: если вы хотите отправлять экземпляры пользовательских классов с обеих сторон, вам необходимо реализовать NSCoding в этих классах. –

1

Я использую Distributed Objects для связи между моей программой какао и отдельной (ненадежной) программой работника. Я начинаю работать как NSTask. Распределенные объекты очень элегантно собраны.

+0

Документация по распределенным объектам гласит, что при отключении соединения объекты перестают существовать. Я хотел бы быстро завершить задачу, но сохранить объекты в основном процессе. Как я могу это сделать? – Kornel

+0

перестают существовать ... Я точно не знаю, что вы просите. Моя задача долговечна, и я могу без проблем запускать методы с помощью DO. DO будет сериализовать/unserialize каждый запрос, поэтому код выглядит точно так, как если бы я взаимодействовал с объектом в рамках одного и того же процесса. Если ваша задача очень короткая, то, возможно, просто используйте STDIN и STDOUT для IPC, отличный пример: http://developer.apple.com/mac/library/samplecode/Moriarity/Introduction/Intro.html – neoneye

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