proc_create的一些疑问
之前是使用create_proc_entry的,但是现在使用新的内核版本,只能使用proc_create了。在使用proc_create的时候,我发现在open的时候需要填充一个show函数,经过测试发现,在open之后,第一次调用read的时候,系统会自动调用这个show函数,然后之后继续read的时候,就不会调用这个show了。这个是什么原因?现在的问题是,我在内核中,大概需要传几K的数据到应用层,这个数据是一直在更新的,但是我在应用层只能在第一次读数据的时候读到内核的数据,之后就读不到了。这个如何解决?以下是部分内核代码
static int wifi_sniffer_read_func(char *seq)
{
int len = 0;
unsigned int idx = 0;
char page[256] = {0};
for(idx = 0;idx < wifi_info_current_cnt;idx++)
{
memset(page,0,sizeof(page));
len = 0;
len += sprintf(page + len,"%02x-%02x-%02x-%02x-%02x-%02x\t",
wifi_sniffer_infos[idx].src_mac[0],wifi_sniffer_infos[idx].src_mac[1],wifi_sniffer_infos[idx].src_mac[2],
wifi_sniffer_infos[idx].src_mac[3],wifi_sniffer_infos[idx].src_mac[4],wifi_sniffer_infos[idx].src_mac[5]);
len += sprintf(page + len,"%d\t",wifi_sniffer_infos[idx].rssi);
len += sprintf(page + len,"%d\t",wifi_sniffer_infos[idx].first_time);
len += sprintf(page + len,"%d\n",wifi_sniffer_infos[idx].last_time);
seq_printf(seq,"%s",page);
printk("len = %d,page = %s\n",len,page);
}
return len;
}
static int wifi_sniffer_show(struct seq_file *seq, void *v)
{
wifi_sniffer_read_func(seq);
return 0;
}
static int wifi_sniffer_open_func(struct inode *inode, struct file *file)
{
return(single_open(file, wifi_sniffer_show,NULL));
}
struct file_operations my_proc_fops = {
.open = wifi_sniffer_open_func,
//.read = wifi_sniffer_read,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};