作者supermin ( )
看板Linux
标题Re: [问题] 请问有关撰写/proc时所用的proc_read函式
时间Fri Jun 20 11:56:57 2008
根据trace到原始的source code部分 proc/fs/generic.c
作者写到的使用说明:
/*
* How to be a proc read function
* ------------------------------
* Prototype:
* int f(char *buffer, char **start, off_t offset,
* int count, int *peof, void *dat)
*
* Assume that the buffer is "count" bytes in size.
*
* If you know you have supplied all the data you
* have, set *peof.
*
* You have three ways to return data:
* 0) Leave *start = NULL. (This is the default.)
* Put the data of the requested offset at that
* offset within the buffer. Return the number (n)
* of bytes there are from the beginning of the
* buffer up to the last byte of data. If the
* number of supplied bytes (= n - offset) is
* greater than zero and you didn't signal eof
* and the reader is prepared to take more data
* you will be called again with the requested
* offset advanced by the number of bytes
* absorbed. This interface is useful for files
* no larger than the buffer.
这种方法意思是指将要读出的资料放在第一个参数栏buffer,
而将第二个参数(自订buffer空间)设为NULL。不过因为buffer
参数的空间大小为PAGE_SIZE,亦即4096KB,所以若我超过此数
值并不适用。
* 1) Set *start = an unsigned long value less than
* the buffer address but greater than zero.
* Put the data of the requested offset at the
* beginning of the buffer. Return the number of
* bytes of data placed there. If this number is
* greater than zero and you didn't signal eof
* and the reader is prepared to take more data
* you will be called again with the requested
* offset advanced by *start. This interface is
* useful when you have a large file consisting
* of a series of blocks which you want to count
* and return as wholes.
* (Hack by
[email protected])
这个方式我就不太明白了,*start通常放的是我的自订buffer
位置,此部分所指的unsigned long value less than the buffer
address意思是?
不知是否有使用过的前辈举个例子说明,感谢。
* 2) Set *start = an address within the buffer.
* Put the data of the requested offset at *start.
* Return the number of bytes of data placed there.
* If this number is greater than zero and you
* didn't signal eof and the reader is prepared to
* take more data you will be called again with the
* requested offset advanced by the number of bytes
* absorbed.
*/
※ 引述《supermin ( )》之铭言:
: 我使用kernel-2.6.17,撰写kernel modules来记录一些系统资讯,
: 使用与user space沟通的机制是/proc,在开完档案之後指定read function大致如下:
: int procfile_read(char *buffer, char **buffer_location,
: off_t offset, int buffer_length, int *eof, void *data)
: {
: if (offset > 0) {
: ret = 0;
: } else {
: *buffer_location = my_buffer;
: }
: bufferLength = 0;
: return bufferLength;
: }
: 其中my_buffer以及bufferLength为全域变数,
: 我想在记录完一堆东西之後使用cat /proc/myfile来看我记录的东西
: 不过由於bufferLength颇大,超过10000bytes,而cat的结果被切掉了,
: 只能显示部分内容,显然应该是buffer overflow的问题,
: 这时候该怎麽解决才能看到全部内容呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.215.191