一段失敗的代碼 inotify的使用
? ? ?在最近的工作中,由于需要在路由器上檢測局域網(wǎng)所有連接的電腦。于是想到一個辦法,監(jiān)控arp緩存。有2個方法。
從內(nèi)核入手,通過修改鄰居子系統(tǒng)(通過修改net/ipv4/arp.c) arp_tbl改變后自己通過 netlink 放通知。第二個方法 通過監(jiān)控 /proc/net/arp 的改變。
? ? 但由于 /proc 文件系統(tǒng)是一類特殊的文件系統(tǒng)。inotify無法監(jiān)控,也是做了后才知道。權(quán)當(dāng)學(xué)習(xí) inotify的用法吧,將這段代碼貼出來做個記號。
? ? 如果哪位仁兄有更好的辦法,還望不吝賜教~!
#include#include#include#include#include#include#include#define?INOTIFY_BUF_LEN ????(sizeof(struct?inotify_event)?+?1024)
int?main(int?argc,char?*?argv[])
{
char?buf[INOTIFY_BUF_LEN];
int?wd,?fd?=?inotify_init();
size_t?i?=?0,len?=?0;
if(-1?==?fd){
printf("inotify_init?failed.n");
return?fd;
}
wd?=?inotify_add_watch(fd,?"/proc/net/arp",IN_MODIFY|IN_DELETE_SELF);
if(-1?==?wd){
????????printf("inotify_add_watch?%s?failedn",?"/proc/net/arp");
????????close(fd);
????????return?-1;??
}
while(true){
do{
size_t?len?=?read(fd,buf,?INOTIFY_BUF_LEN);
}while(len?<?0?&&??errno?==?EINTR);
if(len?<?0)
goto?out;
i?=?0;
while(i?<?len)
{
struct?inotify_event?*?event?=?(struct?inotify_event?*)&buf[i];
if(event->mask?&?IN_DELETE_SELF)?//?文件被刪除.
goto?out;
if(event->mask?&?IN_MODIFY)
{
//?arp?文件被改變.
printf("Arp?file?Changed?[%s].",?event->name);
}
i?+=?sizeof(struct?inotify_event)?+?event->len;
}
}
out:
inotify_rm_watch(fd,?wd);
close(fd);
return?0;
}




