請問有關撰寫/proc時所用的proc_read函式 - Linux

Aaliyah avatar
By Aaliyah
at 2008-06-20T11:56

Table of Contents

根據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的問題,
: 這時候該怎麼解決才能看到全部內容呢?

--
Tags: Linux

All Comments

fx3如何安裝於debian

Elizabeth avatar
By Elizabeth
at 2008-06-20T01:05
我是用 Debian unstable 用官方網站的版本一點問題也沒有 倒是 Debian 的 iceweasel 有顯示上的問題 目前還不知道錯在哪裡就是 -- Wo ist meine Papagena?? Ich brauche das Glockenspiel! - ...

ubunt u有辦法把解析度調成EPC的800*480嗎

Edwina avatar
By Edwina
at 2008-06-20T00:59
朋友要我幫忙問的 他是用EPC灌ubunt u7.10 但EPC的解析度是800*480 不過好像沒有這個選項可以選 請問有辦法調成適合EPC的解析度嗎atat? - ...

linux kernel porting

Jack avatar
By Jack
at 2008-06-20T00:21
請問一下linux kernel porting的步驟是什麼呀? 找了好久,都找不太到,希望有簡單述敘一下 - ...

ssh逾時問題

Leila avatar
By Leila
at 2008-06-19T22:37
最近系統有個怪問題 從外部網路要ssh連進去時都會連不進去 如果從區網連的話很快就出現了帳號輸入的畫面 一開始的帳號輸入很順利 但是一按ENTER後就要過很久才會出現輸入秘密的訊息 但是進去系統後,操作上都沒有什麼問題 後來我試著換了一個IP後就沒這些問題了 登入都很順利 我有從外部網路t ...

請問有關撰寫/proc時所用的proc_read函式

Isabella avatar
By Isabella
at 2008-06-19T21:47
我使用kernel-2.6.17,撰寫kernel modules來記錄一些系統資訊, 使用與user space溝通的機制是/proc,在開完檔案之後指定read function大致如下: int procfile_read(char *buffer, char **buffer_location, ...