所以我正在编写一个涉及写入proc文件的linux内核模块。不幸的是,换行符会出现问题。如果我用vim打开它,它显示为“num ^ @ num ^ @ num ^ @”。如果我抓住它,它会说“numnumnum”。它应该在每个“num”的末尾转到一个新行。
我将用于将每个条目写入proc文件的代码看起来似乎有点hacky。
bufSize = snprintf(str,0,"%lu\n",var);
str = (char*)kmalloc(bufSize*sizeof(char),GFP_KERNEL);
snprintf(str,bufSize,"%lu\n",var);
memcpy(msg+msglen,str,bufSize);
msglen+=(bufSize);
kfree(str);
我不知道字符串会有多长,所以第一个snprintf获取缓冲区所需的长度。初始化缓冲区,然后再次调用snprintf。然后将该字符串复制到msg,其中包含proc文件的数据。指针以现有消息的长度递增。
int procfile_read(char *buffer, char **buffer_location, off_t offset, int
buffer_length, int *eof, void *data) {
int ret;
printk(KERN_INFO "procfile_read (/proc/%s) called\n", PROCFS_NAME);
if (offset > 0) {
/* we have finished to read, return 0 */
ret = 0;
} else {
/* fill the buffer, return the buffer size */
memcpy(buffer, msg, msglen);
ret = msglen;
}
return ret;
这几乎是从教程中复制和粘贴的。
谢谢!
答案 0 :(得分:0)
缓冲区大小太小
bufSize = snprintf(str,0,"%lu\n",var);
// + 1
str = (char*)kmalloc((bufSize + 1)*sizeof(char),GFP_KERNEL);
// + 1
snprintf(str,bufSize + 1,"%lu\n",var);
// + 1
memcpy(msg+msglen,str,bufSize + 1);
// no + 1 here
// Note that msglen is the string length. Add 1 for the size needed.
msglen+=(bufSize);
kfree(str);