日本語 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