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