Запущен поток порождения новых процессов
Я провожу некоторое исследование о том, как 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.