回文章列表
作者supermin.bbs@ptt.cc ( ) 看板: linux
標題Re: [問題] 請問有關撰寫/proc時所用的proc_read函式
時間批踢踢實業 (2008/06/20 Fri 11:56:59)
根據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 Paul.Russell@rustcorp.com.au)

這個方式我就不太明白了,*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
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻