如何写入处理大量数据
问题描述:
我编写了一个内核模块,用于将一些数据量导出到创建的proc条目中。如果数据量较少,我可以轻松创建一个proc入口和出口数据。但是,如果数据量很大,则会导致缓冲区溢出错误。如何写入处理大量数据
我用功能int read_proc(char *buf,char **start,off_t offset,int count, int *eof, void *data)
导出数据。我写了这样的数据:
length =sprintf(buf,"The RESTART_SYSCALL address is %x\n",syscall_table[__NR_restart_syscall]);
length +=sprintf(buf+length,"The EXIT address is %x\n",syscall_table[__NR_exit]);
length +=sprintf(buf+length,"The FORK address is %x\n",syscall_table[__NR_fork]);
length +=sprintf(buf+length,"The READ address is %x\n",syscall_table[__NR_read]);
length +=sprintf(buf+length,"The WRITE address is %x\n",syscall_table[__NR_write]);
length +=sprintf(buf+length,"The OPEN address is %x\n",syscall_table[__NR_open]);
length +=sprintf(buf+length,"The CLOSE address is %x\n",syscall_table[__NR_close]);
length +=sprintf(buf+length,"The WAITPID address is %x\n",syscall_table[__NR_waitpid]);
length +=sprintf(buf+length,"The CREAT address is %x\n",syscall_table[__NR_creat]);
length +=sprintf(buf+length,"The LINK address is %x\n",syscall_table[__NR_link]);
length +=sprintf(buf+length,"The UNLINK address is %x\n",syscall_table[__NR_unlink]);
length +=sprintf(buf+length,"The EXECVE address is %x\n",syscall_table[__NR_execve]);
length +=sprintf(buf+length,"The TIME address is %x\n",syscall_table[__NR_time]);
length +=sprintf(buf+length,"The MKNOD address is %x\n",syscall_table[__NR_mknod]);
length +=sprintf(buf+length,"The LCHOWN address is %x\n",syscall_table[__NR_lchown]);
length +=sprintf(buf+length,"The BREAK address is %x\n",syscall_table[__NR_break]);
length +=sprintf(buf+length,"The OLDSTAT address is %x\n",syscall_table[__NR_oldstat]);
length +=sprintf(buf+length,"The LSEEK address is %x\n",syscall_table[__NR_lseek]);
length +=sprintf(buf+length,"The GETPID address is %x\n",syscall_table[__NR_getpid]);
-----------------------------------
---------------------------------
---------------------------------
我读到,默认情况下只有一个PAGE_SIZE,即4kb导出。我介绍了LDD以找出如何导出大量数据。但我无法理解那里写的是什么。任何人都可以帮助我。
答
您可以使用“seq文件”包装器(linux/seq_file.h)。
这使您可以定义一个返回一行数据的回调函数,并且Linux根据需要多次调用此回调函数。
如果每行都在4K以下,那就很简单。我不确定它是否支持更大的行数。
我会看看例如'/ proc/self/maps'或'/ proc/vmallocinfo'。他们可能每次写一行,并保持某种状态。 – 2011-12-27 06:32:02