日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
SYSCTL_CTX_INIT(9) FreeBSD カーネル開発者マニュアル SYSCTL_CTX_INIT(9)
名称
sysctl_ctx_init, sysctl_ctx_free, sysctl_ctx_entry_add,
sysctl_ctx_entry_find, sysctl_ctx_entry_del -- 動的に作成される sysctl
OID を管理するための sysctl コンテキスト
書式
#include <sys/types.h>
#include <sys/sysctl.h>
int
sysctl_ctx_init(struct sysctl_ctx_list *clist);
int
sysctl_ctx_free(struct sysctl_ctx_list *clist);
struct sysctl_ctx_entry *
sysctl_ctx_entry_add(struct sysctl_ctx_list *clist,
struct sysctl_oid *oidp);
struct sysctl_ctx_entry *
sysctl_ctx_entry_find(struct sysctl_ctx_list *clist,
struct sysctl_oid *oidp);
int
sysctl_ctx_entry_del(struct sysctl_ctx_list *clist,
struct sysctl_oid *oidp);
解説
これらの関数は、動的に作成される OID を管理するためのインタフェースを提供
しています。sysctl コンテキストは、必要なとき、それらの適切な削除と同様に
作成された OID の経過を追うために責任があります。それは、OID の削除操作に
単純なトランザクションの側面を追加します。すなわち、削除の操作が部分的な
方法に失敗するなら、sysctl ツリーをその前の状態にロールバックすることは可
能です。
sysctl_ctx_init() 関数は、sysctl コンテキストを初期化します。clist 引数
は、既に割り付けられた変数を指さなければなりません。使用する前に、コンテ
キストは、初期化されていなければなりません。いったんそれが初期化される
と、コンテキストへのポインタは、すべての SYSCTL_ADD_* マクロ
(sysctl_add_oid(9) を参照) への引数として渡すことができ、それは、新しく作
成された OID を指すエントリで更新されます。
内部的に、コンテキストは、queue(3) TAILQ リンクリストとして表わされます。
リストは、次の struct sysctl_ctx_entry エントリから成ります:
struct sysctl_ctx_entry {
struct sysctl_oid *entry;
TAILQ_ENTRY(sysctl_ctx_entry) link;
};
TAILQ_HEAD(sysctl_ctx_list, sysctl_ctx_entry);
各コンテキストのエントリは、それが管理する 1 つの動的な OID を指します。
新しく作成された OID は、常にリストの前に挿入されます。
sysctl_ctx_free() 関数は、それが管理するコンテキストと関連する OID を削除
します。関数が成功して完了するなら、すべての管理された OID は、(ツリーか
ら削除される) 登録を抹消され、それらのすべての割り付けられたメモリととも
に解放され、同様にコンテキストのエントリも解放されます。
削除操作は、2 ステップで行なわれます。最初に、各コンテキストのエントリに
ついて、関数 sysctl_remove_oid(9) は、リソースの解放を禁止する、0 に設定
されるパラメータ del を付けて、実行されます。このステップの間にエラーがな
いなら、sysctl_ctx_free() は、次のステップに移ります。最初のステップが失
敗するなら、コンテキストに関連したすべての登録を抹消された OID は、再び登
録されます。
注: ほとんどの場合に、プログラマは、OID を作成するとき、OID 番号として
OID_AUTO を指定します。しかしながら、ツリーの OID の登録の間に、この番号
は、CTL_AUTO_START 以上の最初の利用可能な番号に変更されます。コンテキスト
の削除の最初のステップが失敗するなら、OID の再登録は、既に割り当てられた
(OID_AUTO と異なる) OID 番号を変更しません。これは、再登録されたエントリ
がツリーのそれらのオリジナルの位置を維持することを保証します。
2 番目のステップは、実際に動的な OID の削除を行ないます。
sysctl_remove_oid(9) は、始まり (すなわち、最新のエントリ) から開始して、
コンテキストのリストを通して繰り返します。重要: 今回は、関数は、ツリーか
ら OID を削除するだけでなく、すべてのコンテキストのエントリのメモリと同様
に、(oid_refcnt == 0 という条件で) それらのメモリも解放します。
sysctl_ctx_entry_add() 関数は、コンテキストへの既存の動的な OID の追加を
許可します。
sysctl_ctx_entry_del() 関数は、コンテキストからエントリを削除します。重
要: この場合に、対応する struct sysctl_ctx_entry だけが解放されますが、
oidp ポインタは、そのままです。その後、プログラマは、この OID に割り付け
られたリソースを管理する責任があります。
sysctl_ctx_entry_find() 関数は、コンテキストリスト内の与えられた oidp を
検索し、見つかった struct sysctl_ctx_entry へのポインタを返すか、または
NULL を返します。
使用例
次は、新しいトップレベルのカテゴリを作成する方法、と既存の静的なノードに
別のサブツリーを連結する方法の使用例です。この使用例は、OID の経過を追う
ためにコンテキストを使用します。
#include <sys/sysctl.h>
...
static struct sysctl_ctx_list clist;
static struct sysctl_oid *oidp;
static int a_int;
static const char *string = "dynamic sysctl";
...
sysctl_ctx_init(&clist);
oidp = SYSCTL_ADD_ROOT_NODE(&clist,
OID_AUTO, "newtree", CTLFLAG_RW, 0, "new top level tree");
oidp = SYSCTL_ADD_INT(&clist, SYSCTL_CHILDREN(oidp),
OID_AUTO, "newint", CTLFLAG_RW, &a_int, 0, "new int leaf");
...
oidp = SYSCTL_ADD_NODE(&clist, SYSCTL_STATIC_CHILDREN(_debug),
OID_AUTO, "newtree", CTLFLAG_RW, 0, "new tree under debug");
oidp = SYSCTL_ADD_STRING(&clist, SYSCTL_CHILDREN(oidp),
OID_AUTO, "newstring", CTLFLAG_RD, string, 0, "new string leaf");
...
/* 今, OID を解放することができます */
if (sysctl_ctx_free(&clist)) {
printf("can't free this context - other OIDs depend on it");
/* 訳注: このコンテキストを解放できません - 他の OID が依存しています */
return (ENOTEMPTY);
} else {
printf("Success!\n");
return (0);
}
この使用例は、次のサブツリーを作成します:
debug.newtree.newstring
newtree.newint
最新のエントリ (葉) を解放することによって開始し、次により古いエントリ
(この場合、ノード) を解放に進める、1 つの sysctl_ctx_free() 呼び出しを通
して、両方のツリーが削除され、それらのリソースが解放されることに注意して
ください。
関連項目
queue(3), sysctl(8), sysctl(9), sysctl_add_oid(9), sysctl_remove_oid(9)
歴史
これらの関数は、FreeBSD 4.2 ではじめて登場しました。
作者
Andrzej Bialecki <abial@FreeBSD.org>
バグ
現在の削除アルゴリズムは、いくらか重くなっています。最悪の場合に、すべて
の OID は、登録を抹消され、再び登録され、次に登録を抹消され、削除される必
要があります。しかしながら、アルゴリズムは、削除操作ためのトランザクショ
ンのプロパティを保証します。
コンテキストでのすべての操作は、リンクリストの横断を含んでいます。この理
由のために、エントリの作成と削除は、比較的コストがかかります。
FreeBSD 13.2 July 31, 2014 FreeBSD 13.2