我使用FileObserver监视'/ proc / net / arp'目录,但我无法在onEvent方法中获取任何事件。代码如下:
public class MyFileObserver extends FileObserver{
private Set<OnClientConnectListener> mListeners;
private boolean mWatching = false;
public MyFileObserver(String path) {
super(path);
}
@Override
public void onEvent(int event, String path) {
Log.d("conio","event:"+event+" , path:"+path);
switch(event) {
case FileObserver.MODIFY:
Log.d("conio","event modify");
ArrayList<String> ips = WifiHelper.getClientList(true, 3000);
if(mListeners != null) {
for(OnClientConnectListener lis : mListeners) {
lis.onConnectChange(ips);
}
}
break;
}
}
我怎么能监视'/ proc / net / arp',我检查它有读取此文件的perssion,我可以使用FileInputStream从中读取数据。
答案 0 :(得分:1)
文件观察器基于inotify机制,但是,/ proc不是通用文件系统。所有'文件'只是内核的一个接口,通过它可以从内核获取/设置信息。所有内容都是即时生成。这就是为什么inotify不适用于/ proc系统的原因。请参阅此page。
然而,Ubuntu 13.04的用户声称这样可以正常工作。也许最新的内核支持这样的设施。我在这里复制了帖子,原始页面为here。
编译以下程序(inotifyerr.c)
#include <stdlib.h>
#include <stdio.h>
#include <sys/inotify.h>
int main(int argc, char* argv[]){
int fd = inotify_init();
if (fd == -1){
perror("inotify_init");
}
char path[256];
sprintf(path,"/proc/%s",argv[1]);
printf("watching %s\n",path);
int wd = inotify_add_watch(fd,path,IN_ALL_EVENTS);
if (wd == -1){
perror("inotify_add_watch");
}
char buf[1024];
ssize_t siz = read(fd,buf,1024);
if (siz == -1){
perror("inotify read");
}
printf("read done, bytes: %d\n",siz);
}
gcc inotifyerr.c
在Ubuntu 13.04上测试过,它运行正常:
sworddragon@ubuntu:~/data$ sleep 20 &
[1] 3009
sworddragon@ubuntu:~/data$ ls /proc/3009
attr cgroup comm cwd fd latency map_files mountinfo net oom_adj pagemap sched smaps statm task
autogroup clear_refs coredump_filter environ fdinfo limits maps mounts ns oom_score personality schedstat stack status wchan
auxv cmdline cpuset exe io loginuid mem mountstats numa_maps oom_score_adj root sessionid stat syscall
sworddragon@ubuntu:~/data$ ./a.out 3009
watching /proc/3009
read done, bytes: 128
在/ proc上使用inotifywait也可以正常工作