2011-12-17 21 views
9

linuxでは、IPアドレスに変更があったときに通知を受けるコールバックやシグナルなどの方法があります。 私はカーネルでコールバックを登録したい、あるいはカーネルからのシグナルを取得したいのですが、ソケット上でコードをポーリングするのではなく、自動的に行われます。IPアドレスの変更を自動的に通知する方法

ありがとうございます。

+0

私は 'udev'を調べます –

+0

udevはそれを本当に気にしません。 –

答えて

16

netlinkソケット経由でカーネルから通知を受け取ります。

NETLINK_ROUTEソケットを作成し、それを5グループに変更して、bind()を介してIP変更にサブスクライブする必要があります。次に、タイプRTM_NEWADDRRTM_DELADDRのnetlinkメッセージを、IFA_LOCALまたはIFA_ADDRESSというルート属性で受信します。

1

"/ sbin/ip monitor"を子プロセスとして起動し、その出力を監視することができます。

IPアドレスが変更されたときなどに表示されます。詳細は、ip(8)のマニュアルページを参照してください。 Cプログラミングなし

3

$ ip monitor 

は、その標準出力に出力を生成し、コマンド、いつでもIPサブシステムの変更では、いくつかの設定。コマンド

# ip addr add 10.10.10.10/24 dev em1 

は、次の出力

2: em1 inet 10.10.10.10/24 scope global em1 
local 10.10.10.10 dev em1 table local proto kernel scope host src 0.10.10.10 
10.10.10.0/24 dev em1 proto kernel scope link src 10.10.10.10 
broadcast 10.10.10.0 dev em1 table local proto kernel scope link src 10.10.10.10 
broadcast 10.10.10.255 dev em1 table local proto kernel scope link src 10.10.10.10 

コマンドで10.10.10.10 addresssを削除

# ip addr del 10.10.10.10/24 dev em1 

は、以下の出力

使用できる
Deleted 2: em1 inet 10.10.10.10/24 scope global em1 
Deleted 10.10.10.0/24 dev em1 proto kernel scope link src 10.10.10.10 
Deleted broadcast 10.10.10.255 dev em1 table local proto kernel scope link src 10.10.10.10 
Deleted broadcast 10.10.10.0 dev em1 table local proto kernel scope link src 10.10.10.10 
Deleted local 10.10.10.10 dev em1 table local proto kernel scope host src 10.10.10.10 

を生成生成しますeitシェルやいくつかのawkやperlを使ってこれらのメッセージを処理するか、popen()とfriendのCライブラリ関数を使ってCでアウトプットを処理することができます。

NETLINK経由でカーネルにフックできます。これはかなり複雑で、あまりよく書かれていません。 Netlinkインターフェイスの開始点については、Wikipedia articleを参照してください。

関連する問題