Запущен поток порождения новых процессов

Я провожу некоторое исследование о том, как launchd загружает свои сервисы из plist-файлов под /Library/LaunchDaemons/ или через команду launchctl load

До сих пор мне удалось собрать несколько различных источников и составить следующую смутную картину, насколько я понимаю:

После загрузки сервиса (launchctl load) Процесс launchctl отправьте launchd соответствующее сообщение XPC, а затем launchd разветвляется в новый процесс в контексте xpcproxy, Этот общий процесс ожидает другого вызова XPC от launchd запустить его реальный контекст процесса в соответствии с launchDaemon plst.

Это объяснение звучит правильно? Может быть, кто-нибудь может помочь мне сделать это более точным?

Спасибо

1 ответ

Решение

Это на самом деле немного сложнее. Ядро состоит из двух частей, BSD и ядра Mach; последний отвечает за управление памятью и планирование процессов.

Каждый процесс Mach имеет одну или несколько задач Mach (на самом деле права на порт задачи!). Когда приложение запускается впервые, оно имеет только одно право - порт начальной загрузки, позволяющий установить связь с launchd. Обратите внимание, что право на порт задачи является однонаправленным, поэтому процесс запуска, который имеет право на связь с launchd, должен дать право для launchd связаться с ним.

Когда launchd получает сообщение XPC, от демона запуска зависит, какое действие он предпринимает. Возможно, что сообщение предназначено для службы, работающей с сетевым портом, который может работать или не работать. При запуске он передает все аргументы из вызывающего процесса в работающую службу. Если он не запущен, он может предоставлять услугу по требованию, сначала запуская процесс.

Более конкретно вы спрашивали о launchctl load, Поскольку исходный код для launchd больше не является открытым исходным кодом, следующим лучшим ресурсом является работа по обратному инжинирингу Джонатана Левина; Автор Mac OS X и iOS Internals, а в последнее время и его новых самоизданных книг по * OS Internals.

Здесь вы найдете его слайды о launchd, но, вероятно, более полезной для вас является его версия launchctl, jlaunchctl с открытым исходным кодом.

Наконец, если вы хотите просматривать содержимое сообщений XPC между процессами, отключите SIP и используйте бесценный инструмент Джонатана для XPoCe.

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