EVENTHANDLER(9) | FreeBSD Kernel Developer's Manual | EVENTHANDLER(9) |
名称
EVENTHANDLER — カーネルイベント操作関数書式
#include < sys/eventhandler.h>EVENTHANDLER_DECLARE( name, type);
EVENTHANDLER_INVOKE( name, ...);
eventhandler_tag
EVENTHANDLER_REGISTER( name, func, arg, priority);
EVENTHANDLER_DEREGISTER( name, tag);
eventhandler_tag
eventhandler_register( struct eventhandler_list *list, const char *name, void *func, void *arg, int priority);
void
eventhandler_deregister( struct eventhandler_list *list, eventhandler_tag tag);
struct eventhandler_list *
eventhandler_find_list( const char *name);
void
eventhandler_prune_list( struct eventhandler_list *list);
解説
EVENTHANDLER メカニズムはカーネルサブシステムでカーネルイベントでの関心を登録する方法を提供し、これらのイベントが起こるとき、それらのコールバック関数を呼び出します。このサブシステムを使用する通常の方法はマクロインタフェースを使用します。イベントハンドラとコールバック関数リストで動作するために使用することができるマクロは次の通りです:
- EVENTHANDLER_DECLARE()
- このマクロはタイプ type のコールバック関数で引数 name によって指定されるイベントハンドラを宣言します。
- EVENTHANDLER_REGISTER()
- このマクロはイベントハンドラ name でコールバック関数 func を登録します。呼び出されるとき、関数 func は、マクロ EVENTHANDLER_INVOKE() (下記参照) を通して渡された任意の追加パラメータとともにその最初のパラメータとして引数 arg で呼び出されます。コールバック関数は優先された順序で呼び出されます。イベントに関連している他のコールバックの間のそれぞれのコールバックの相対的な優先順序は EVENTHANDLER_PRI_FIRST (最も高い優先順序) から EVENTHANDLER_PRI_LAST (最も低い優先順序) の範囲の整数である引数 priority によって与えられます。ハンドラにそれに関連している特定の優先順序がないなら、シンボル EVENTHANDLER_PRI_ANY が使用されます。登録が成功するなら、 EVENTHANDLER_REGISTER() はタイプ eventhandler_tag のクッキーを返します。
- EVENTHANDLER_DEREGISTER()
- このマクロは引数 name によって指定されたイベントハンドラからタグ tag に関連している以前に登録されたコールバックを取り除きます。
- EVENTHANDLER_INVOKE()
- このマクロは、イベントハンドラ name に関連しているすべてのコールバックを呼び出すために使用されます。このマクロは可変長引数です。 name パラメータの後のマクロへの追加引数は、それぞれの登録されたコールバック関数への 2 番目とその後の引数として渡されます。
マクロは次の関数を使用して実装されます:
- eventhandler_register()
-
eventhandler_register() 関数は、与えられたイベントでコールバックを登録するために使用されます。この関数によって期待される引数は次の通りです:
- list
- 既存のイベントハンドラリスト、または NULL へのポインタ。 list が NULL であるなら、引数 name に対応するイベントハンドラリストが使用されます。
- name
- イベントハンドラリストの名前。
- func
- コールバック関数へのポインタ。引数 arg はそれが呼び出されるとき、最初の引数としてコールバック関数 func に渡されます。
- priority
- このイベントで登録されたすべてのコールバックの間のこのコールバックの相対的な優先順序。有効な値は EVENTHANDLER_PRI_FIRST から EVENTHANDLER_PRI_LAST の範囲です。
eventhandler_register() 関数は特定のコールバック関数を取り除くために後で、 eventhandler_deregister() で使用することができる tag を返します。
- eventhandler_deregister()
- eventhandler_deregister() 関数は list によって指されたイベントハンドラリストからタグ tag に関連しているコールバックを取り除きます。この関数は、イベントハンドラコールバックの中から呼び出すために安全です。
- eventhandler_find_list()
- eventhandler_find_list() 関数はイベント name に対応するイベントハンドラリスト構造体へのポインタを返します。
- eventhandler_prune_list()
- eventhandler_prune_list() 関数はイベントリスト list からすべての登録を取り消されたコールバックを取り除きます。
カーネルイベントハンドラ
次のイベントハンドラがカーネルに存在しています:- acpi_sleep_event
- システムが送信されスリープするとき呼び出されるコールバック。
- acpi_wakeup_event
- システムが起こされるとき呼び出されるコールバック。
- dev_clone
- 新しいエントリが /dev の下に作成されるとき呼び出されるコールバック。
- ifaddr_event
- アドレスがネットワークインタフェースで設定されるとき呼び出されるコールバック。
- if_clone_event
- インタフェースがクローンであるときに呼び出されるコールバック。
- ifnet_arrival_event
- 新しいネットワークインタフェースが現れるとき呼び出されるコールバック。
- ifnet_departure_event
- ネットワークインタフェースがダウンされるとき呼び出されるコールバック。
- bpf_track
- BPF リスナがネットワークインタフェースにアタッチするか、またはネットワークインタフェースからデタッチするとき、呼び出されるコールバック。
- kld_load
- リンカファイルがロードされた後に、呼び出されるコールバック。
- kld_unload
- リンカファイルがアンロードに成功した後に呼び出されるコールバック。
- kld_unload_try
- リンカファイルがアンロードされる前に、呼び出されるコールバック。これらのコールバックは、エラーを返し、アンロードが進行することを防ぐために使用されます。
- power_profile_change
- システムの電源プロフィールが変化するとき呼び出されるコールバック。
- process_exec
- プロセスが exec() 操作を実行するとき呼び出されるコールバック。
- process_exit
- プロセスが終了するとき呼び出されるコールバック。
- process_fork
- プロセスが子供をフォーク (fork) するとき呼び出されるコールバック。
- shutdown_pre_sync
- ファイルシステムが同期する前のシャットダウン時に呼び出されるコールバック。
- shutdown_post_sync
- すべてのファイルシステムが同期した後のシャットダウン時に呼び出されるコールバック。
- shutdown_final
- システムを停止 (halt) する直前に呼び出されるコールバック。
- vm_lowmem
- 仮想メモリが少なくなったときに呼び出されるコールバック。
- watchdog_list
- システムウオッチドッグタイマが再初期化されるときに呼び出されるコールバック。
戻り値
マクロ EVENTHANDLER_REGISTER() と関数 eventhandler_register() は、その後の EVENTHANDLER_DEREGISTER() または eventhandler_deregister() の呼び出しに使用される、タイプ eventhandler_tag のクッキーを返します。eventhandler_find_list() 関数は、パラメータ name に対応するイベントハンドラリストへのポインタを返し、そのようなリストが見つけられなかったなら、 NULL を返します。
歴史
EVENTHANDLER 機能は、 FreeBSD 4.0 ではじめて登場しました。作者
このマニュアルページは、 <jkoshy@FreeBSD.org>によって書かれました。August 1, 2013 | FreeBSD |