EN JA
EVENTHANDLER(9)
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 へのポインタ。 listNULL であるなら、引数 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 ではじめて登場しました。

作者

このマニュアルページは、 Joseph Koshy <jkoshy@FreeBSD.org>によって書かれました。
August 1, 2013 FreeBSD