Я пишу расширение ядра сети для фильтрации сокетов.Чтобы сделать его настраиваемым, пользовательская программа считывает файл конфигурации и передает информацию в kext через сокет PF_SYSTEM
.
Если я хочу, чтобы при запуске системы фильтр сокетов был запущен и работал как можно скорее.Как бы я поставил хореографию запуска?
Моя текущая идея состоит в том, чтобы использовать launchd для запуска небольшой программы инициализации пользовательского пространства.Эта программа будет использовать kextload
для запуска kext.После этого он будет читать конфигурационный файл и общаться с kext через сокет PF_SYSTEM
.Выполнив свою работу, он затем быстро завершит работу.
Другой вариант будет иметь два элемента launchd
, один для kext (с использованием kextload
) и другой для программы чтения конфигурационных файлов пользовательского пространства.Это позволит избежать развилки, но в противном случае будет идентичным.В любом случае, launchd
придется запускать быструю пользовательскую программу, не являющуюся демоном.
Однако, похоже, launchd
ориентирован на запуск реальных демонов, а не на быстрые задачи, выполняющие свою работу и завершающиеся. Документ библиотеки разработчика гласит:
Важное замечание: Если ваш демон отключается слишком быстро после запуска, launchd может подумать, что он упал.Демоны, которые продолжают это поведение, могут быть приостановлены и больше не запускаться при поступлении будущих запросов.Чтобы избежать этого, не выключайте компьютер в течение 10 секунд после запуска.
Это создает у меня впечатление, что launchd
- неправильный способ сделать это.Как мне организовать запуск?Вся моя идея движется в неправильном направлении?
(В качестве примечания я хочу дать пользователю возможность изменять параметры фильтрации также во время выполнения. Я полагаю, что это можно сделать, просто открыв новыйСоединение сокета PF_SYSTEM с kext всякий раз, когда требуются изменения.)