一段失敗的代碼 inotify的使用
? ? ?在最近的工作中,由于需要在路由器上檢測局域網(wǎng)所有連接的電腦。于是想到一個辦法,監(jiān)控arp緩存。有2個方法。
從內核入手,通過修改鄰居子系統(tǒng)(通過修改net/ipv4/arp.c) arp_tbl改變后自己通過 netlink 放通知。第二個方法 通過監(jiān)控 /proc/net/arp 的改變。
? ? 但由于 /proc 文件系統(tǒng)是一類特殊的文件系統(tǒng)。inotify無法監(jiān)控,也是做了后才知道。權當學習 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; }