launchd: поиск службы Mach не удался - PullRequest
2 голосов
/ 12 января 2012

Вспомогательный инструмент, наделенный привилегиями root с помощью launchd, не может установить NSConnection с моей основной программой.

Соединение работает, когда я запускаю HelperTool вручную с помощью sudo, что доказывает, что мой сервис хорошо работает, ичто проблема возникает из-за launchd.

Журналы:

12.01.12 12:41:07    Debou[8247]    [CaptureQueue startCaptureQueueThread] Launched NSConnection service Debou-CaptureQueueThread - (** NSConnection 0x100522090 receivePort <NSMachPort: 0x1005511d0> sendPort <NSMachPort: 0x1005511d0> refCount 1 **)
12.01.12 12:41:10    com.apple.launchd[1]    System: Looking up service Debou-CaptureQueueThread
12.01.12 12:41:10    com.apple.launchd[1]    (com.Debou.PacketTool[8260]) Mach service lookup failed: Debou-CaptureQueueThread 

Почему launchd не сможет увидеть мою отправленную NSConnection?

1 Ответ

3 голосов
/ 12 января 2012

AIUI это связано с иерархией пространства имен Маха. Ваша основная программа зарегистрирует свое NSConnection в пространстве имен сеанса пользователя, в то время как LaunchDaemon работает в глобальном контексте, поэтому он не может видеть ни одно пространство имен сеанса. Обратите внимание, что когда вы запускаете помощника с помощью sudo, он все равно работает в контексте сеанса, даже если он работает от имени пользователя root. См. tn2083 , особенно разделы «Контексты выполнения» и «Рекомендации Daemon IPC».

Возможно, вы сможете продать соединение из LaunchDaemon и подключиться из основной программы (так как пространства имен сеансов наследуются от глобального пространства имен), но, вероятно, было бы лучше вообще переключиться на другой механизм. Как Куинн "Эскимос!" указывает на это сообщение , что использование распределенных объектов между доменами безопасности (например, пользовательской программы и демона, работающего от имени пользователя root) очень затрудняет правильную проверку ввода и, следовательно, может привести к ошибкам безопасности.

...