我正在编写一个内核模块,我需要返回给用户很多数据。
我有一个以log_list_head为头的链表(他是空的)和函数print_log,它将log_list数据传输到字符串并将其存储在缓冲区中。
ssize_t my_read(struct file *filp, char *buff, size_t length, loff_t *offp){
struct log_list *temp;
char *buffer;
buffer = (char *)kmalloc(1024 *sizeof(char),GFP_KERNEL);
temp = log_list_head->next;
while (temp != NULL){
print_log(temp->data,buffer);
copy_to_user(buff, buffer, strlen(buffer)); //This is not correct
temp=temp->next;
}
copy_to_user(buff, message, strlen(buffer));
kfree(buffer);
return 0;
}
我有两个问题
我想一次向用户发送一个缓冲区。
谢谢你,
目前你每次都会覆盖用户增益。
如果你让
buffer
足够大以容纳数据+消息的最大大小,你可以一次性完成:
int i=0;
while (temp != NULL){
print_log(temp->data, buffer+i); //offset by amount already done
i = strlen(buffer);
temp=temp->next;
}
strcat(buffer, message);
copy_to_user(buff, buffer, strlen(buffer)+1); // include terminator
如果 print_log 跟踪缓冲区的末尾,可以提高效率,但这可能是不成熟的优化。