SYSCTL_ADD_OID(9) FreeBSD カーネル開発者マニュアル SYSCTL_ADD_OID(9)
名称
sysctl_add_oid, sysctl_move_oid, sysctl_remove_oid − ランタイム sysctl ツ リー操作 |
書式
#include <sys/types.h> struct sysctl_oid * |
sysctl_add_oid(struct sysctl_ctx_list *ctx,struct sysctl_oid_list *parent, int number, const char *name,int kind, void *arg1, int arg2,int (*handler) (SYSCTL_HANDLER_ARGS), const char *format,const char *descr); int
sysctl_move_oid(struct sysctl_oid *oidp, struct sysctl_oid_list *parent); int struct sysctl_oid_list * struct sysctl_oid_list * struct sysctl_oid * struct sysctl_oid * struct sysctl_oid * struct sysctl_oid * struct sysctl_oid * struct sysctl_oid * struct sysctl_oid * struct sysctl_oid * struct sysctl_oid * struct sysctl_oid * 解説 |
これらの関数およびマクロは sysctl oid のランタイム (例えばモジュールの存 在期間) での作成と削除のためのインタフェースを提供します。リンカセット ( 詳細は <sys/linker_set.h> および src/sys/kern/kern_sysctl.c を参照) に基 づく代わりの方法は、各々のモジュールのロード時およびアンロード時の作成と 削除のみを可能にします。 型 CTLTYPE_NODE の動的な oid は再利用可能であるため、複数のコードセクショ ンが、 oid を作成および削除することが可能です。実際には、参照カウントに基 づいて、その割り当ておよび解放が行われます。その結果として、2 つ以上の コードセクションが、部分的に重なり、両者が使用できるツリーを作成可能にし ます。重なる葉の作成や、同一の名前と親を持つ異なる型の子の作成は、不可能 です。 新しく作成された oid は親のノードに接続されます。これら全ての関数およびマ クロ (sysctl_remove_oid() は例外) において、必須パラメータの 1 つ parent は、子の親リストの先頭を指します。 殆どのトップレベルのカテゴリは静的に作成されます。既存の静的な oid に接続 するときに、このポインタは SYSCTL_STATIC_CHILDREN() マクロによって取得す ることが可能で、その OID_NAME 引数は CTLTYPE_NODE 型の親 oid の名前 (すな わち、 sysctl(8) によって表示される名前に、アンダスコアを前置し、全ての ドットをアンダスコアで置き換えた名前) です。 既存の動的な oid に接続するときに、このポインタは SYSCTL_CHILDREN() マク ロによって取得することが可能で、その oidp 引数は CTLTYPE_NODE 型の親 oid を指します。 sysctl_add_oid() 関数はあらゆる型の生の oid を作成します。 oid の作成が成 功した場合には、この関数はその oid へのポインタを返します。そうでない場合 には、 NULL を返します。 sysctl_add_oid() のための引数の多くはマクロと共 通です。引数は以下のとおりです。 |
ctx
オプションの sysctl コンテキストへのポインタ、または NULL です。 詳細は sysctl_ctx_init(9) を参照してください。特別な作成および削 除のシーケンスが要求されるのでなければ、作成する動的な oid を組 織するためにコンテキストを使用することを、プログラマは強く勧告さ れています。 ctx が NULL でない場合には、新しく作成される oid は 最初のエントリとしてこのコンテキストに追加されます。 parent number name kind arg1 arg2 handler format descr sysctl_move_oid() 関数は存在している oid の親を付け変えます。その oid は、まるで number に OID_AUTO が設定されて作成されたかの様に、新しい番号 を割り当てられます。 sysctl_remove_oid() 関数は動的に作成された oid をツリーから削除し、オプ ションでそのリソースを解放します。これは以下の引数を取ります。 oidp del recurse 再度言いますが、殆んどの場合、作成された oid を見失わないようにするため、 および後で整然とした流儀でそれらを削除するため、 sysctl_ctx_init(9) で解 説されているように、プログラマはコンテキストを使用するべきです。 与えられた型の oid の作成を助ける定義済みのマクロセットがあります。 それらを以下に示します。 SYSCTL_ADD_OID() SYSCTL_ADD_NODE() SYSCTL_ADD_STRING() SYSCTL_ADD_INT() SYSCTL_ADD_UINT() SYSCTL_ADD_LONG() SYSCTL_ADD_ULONG() SYSCTL_ADD_OPAQUE() SYSCTL_ADD_STRUCT() SYSCTL_ADD_PROC() 使用例 |
以下は、どのように新しいトップレベルのカテゴリを作成するか、およびどのよ うに既存の静的なノードに別のサブツリーを引っ掛けるかを示す使用例です。こ の使用例はコンテキストを使用していません。これは全ての後でそれらを解放す るといった、中間の oid の退屈な管理を結果として生じさせます。 #include <sys/sysctl.h> ... /* 新しく作成したサブツリーへのポインタは、後でそれらを解放するために * 保存しておく必要があります。 */ struct sysctl_oid *root1, *root2, *oidp; int a_int; char *string = "dynamic sysctl"; ... root1 = SYSCTL_ADD_NODE( NULL, SYSCTL_STATIC_CHILDREN(/* tree top */), |
OID_AUTO, "newtree", CTLFLAG_RW, 0, "new top level tree"); |
oidp = SYSCTL_ADD_INT( NULL, SYSCTL_CHILDREN(root1), |
OID_AUTO, "newint", CTLFLAG_RW, &a_int, 0, "new int leaf"); |
... |
OID_AUTO, "newtree", CTLFLAG_RW, 0, "new tree under debug"); |
oidp = SYSCTL_ADD_STRING( NULL, SYSCTL_CHILDREN(root2), |
OID_AUTO, "newstring", CTLFLAG_RD, string, 0, "new string leaf"); |
この使用例は以下のサブツリーを作成します。 debug.newtree.newstring newtree.newint これ以上必要でなくなった全ての oid は解放されるべきであることに注意! |
関連項目
歴史
これらの関数は FreeBSD 4.2 ではじめて登場しました。 |
作者
Andrzej Bialecki 〈abial@FreeBSD.org〉 |
バグ
多くのコードセクション間でノードを共有することは、時々リソースをロックす ることがある相互依存を引き起こします。例えば、モジュール B によって作成さ れた oid に対し、モジュール A がサブツリーを引っ掛けた場合には、モジュー ル B はその oid を削除できないでしょう。これらの問題は sysctl コンテキス トによって適切に取り扱われます。 ツリー上の多くの操作はリンクリストを横切ることを必要とします。この理由の ため、oid の作成と削除は相対的にコストがかかります。 FreeBSD 10.0 July 15, 2000 FreeBSD 10.0 |