ソケット フィルタリング用のネットワーク カーネル拡張機能を作成しています。構成可能にするために、ユーザーランド プログラムは構成ファイルを読み取り、PF_SYSTEM
ソケットを介して情報を kext に渡します。
システムの起動時にできるだけ早くソケット フィルターを起動して実行したい場合、起動をどのように振り付けますか?
私の現在の考えは、launchd を使用して小さなユーザーランド初期化プログラムを開始することです。このプログラムはkextload
、kext を開始するために使用します。PF_SYSTEM
その後、構成ファイルを読み取り、ソケットを介して kext と通信します。仕事を終えると、すぐに終了します。
もう 1 つのオプションは、2 つのlaunchd
アイテムを用意することです。1 つは kext (を使用kextload
) 用で、もう 1 つはユーザーランド構成ファイル リーダー用です。これによりフォークは回避されますが、それ以外は同じです。いずれにlaunchd
しても、デーモン以外のユーザーランド プログラムをすばやく実行する必要があります。
ただし、launchd
作業を行って終了する迅速なタスクではなく、実際のデーモンを起動することを目的としているようです。開発者ライブラリ ドキュメントには次のように書かれています。
重要:起動後にデーモンがあまりにも早くシャットダウンすると、launchd はデーモンがクラッシュしたと判断する場合があります。この動作を継続するデーモンは一時停止され、将来のリクエストが到着したときに再び起動されない場合があります。この動作を回避するには、起動後少なくとも 10 秒間はシャットダウンしないでください。
launchd
これは、これを行う正しい方法ではないという印象を与えます。ローンチはどのように準備すればよいですか? 私の考え全体が間違った方向に進んでいますか?
(補足として、ユーザーが実行時にフィルタリング オプションを変更できるようにしたいと考えています。これは、変更が必要なときはいつでも、kext への新しい PF_SYSTEM ソケット接続を開くだけで簡単に実行できると思います。)