换行符未显示在proc文件中

换行符未显示在proc文件中,c,linux,vim,linux-kernel,kernel,C,Linux,Vim,Linux Kernel,Kernel,因此,我正在编写一个linux内核模块,其中包括写入一个proc文件。不幸的是,换行符出现了一些问题。如果我用vim打开它,它会显示为“num^@num^@num^@”。如果我点击它,它会说“numnumnum”。它应该在每个“num”的末尾添加一行 诚然,我将每个条目写入proc文件的代码似乎有点粗糙 bufSize = snprintf(str,0,"%lu\n",var); str = (char*)kmalloc(bufSize*sizeof(char),GFP_KERN

因此,我正在编写一个linux内核模块,其中包括写入一个proc文件。不幸的是,换行符出现了一些问题。如果我用vim打开它,它会显示为“num^@num^@num^@”。如果我点击它,它会说“numnumnum”。它应该在每个“num”的末尾添加一行

诚然,我将每个条目写入proc文件的代码似乎有点粗糙

    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;
这几乎是从教程中复制和粘贴的


谢谢

缓冲区大小太小

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);

成功了。谢谢我仍然不太明白为什么你不在增量上加1,但这是有效的
msglen
是不带尾随的长度
\0
。它累加总长度,然后是
memcpy()
的偏移量。该偏移量不需要+1。原始的“num^@”(即“num\0”)出现是因为
snprintf(str,bufSize,“%lu\n”,var)太小,将
\0
放在
bufSize-1
位置,该位置是通过
memcpy()
复制的。