软件开发: 09 2010存档

正确的read()

| | Comments (3) | TrackBacks (0)

从一个虚拟设备里读取数据,我是用read系统调用一次读完,发现反复读取多次后,数据出现了问题。

由于是自己写的虚拟设备,所以先怀疑是kernel module写的有问题,我自己实现了虚拟设备的read方法,难道偏移量的处理有问题?于是拿出万能的printk,调试......咦,怪了,怎么dmesg里打出的消息数不对?喔,dmesg的缓冲区设小了,改个大的,10M

dmesg -s 10485760​

测完,我在把内核数据通过copy_to_user拷给用户态之前还是正常的,拷了就不正常了,这这这,我记得copy_to_user就是判断一下内存空间的有效性,本身不会乱来的呀,好,为了证明,我改成memcpy。

还是不行,似乎只要把数据拷贝一下就不对了,神了......

最后终于发现,和module的代码没关系,是我在read的时候没有对读取的数据做结尾:

read(fd, buffer, BUFFER_SIZE);

// process buffer

正确的做法是:

int res = read(fd, buffer, BUFFER_SIZE);

buffer[res] = 0;

// process buffer

唉,一个简单的代码疏漏耗费半天时间。要是有个代码高手指导指导我就好了。