我有一个kernel module
在proc-fs
创建一个条目,一个userspace-program
读取该文件。
我的proc read-function
看起来像是:
typedef struct {
int integer;
unsigned long ulong;
char string[100];
float floatt;
bool booll;
u16 crc;
} struktur;
static int round = 0, len = 0, temp = 0, err;
struktur *pde_data_p;
int proc_read(struct file *filp, char *buf, size_t count, loff_t *offp) {
int i;
unsigned char *crcbuf;
struktur struct_buf;
pde_data_p = PDE_DATA(file_inode(filp));
crcbuf = (unsigned char*)pde_data_p;
memcpy(&struct_buf, pde_data_p, sizeof(struktur));
if (pde_data_p == NULL) {
printk(KERN_ERR "pde->data == NULL\n");
round = 0;
return 0;
}
if (round == 0)
temp = sizeof(struktur);
if (count > temp)
count = temp;
struct_buf.crc = crc16(struct_buf.crc, crcbuf, sizeof(struktur)-sizeof(unsigned short));
err = copy_to_user(buf, pde_data_p, count);
//if (err == 0) { // copy_to_user finished
round = 0;
temp = 0; // taking this line out makes it work in the prog but not with my cat
return temp;
//} else { // copy_to_user failed -> return number of bytes that have not been copied
//temp = err;
//round++;
//return temp;
//}
}
我的program code
是:
typedef struct {
int integer;
unsigned long ulong;
char string[100];
float floatt;
bool booll;
unsigned short crc;
} struktur;
int main(void) {
int i;
struktur str_inp;
unsigned short crc = 0;
unsigned char *str_p = (unsigned char*)&str_inp;
FILE *fp = fopen("/proc/sen/entry", "r");
fread(&str_inp, 1, sizeof(struktur), fp);
fclose(fp);
}
正如您所看到的,我的proc读取函数返回读取的字节数,而不是零
这样我的程序工作正常,但是当我尝试通过cat(cat / proc / sen / entry)读取时,它永远不会完成,因为它永远不会返回0。
当我在return 0
完成后更改我的代码和copy_to_user
时,通过cat
阅读工作正常,但我的程序似乎是随机内存。当我返回复制字节数的一半时,用户空间程序读取的数据只有一半是正确的。
答案 0 :(得分:0)
proc_read
函数必须返回的内容取决于*offp
中移交的位置。如果只需要为您的给定用户空间程序代码和cat
(不是struktur
的部分读取)工作,那么它就足够了
if (*offp) return 0; // no more data to return
else *offp = sizeof (struktur); // file position after data returned
- 此声明在copy_to_user()
。