09 2010存档

笑话又两则

| | Comments (2) | TrackBacks (0)

这个是以前的事。

我在读研,晚上买3元钱的面包,第二天早上吃掉一半当早餐,第三天早上再吃另一半。

妈表示很生气:“怎么吃一半面包?都吃了呗”

我:“3元的面包,太贵了​​”

妈对着爸说:“你管管你儿子,瞎节约,不像话。一个面包每次只吃一半!”

爸:“一半?那也要看这个面包有多大呀,(指着家里的枕头)要是那么大,我也只能吃一半啊!”


这个是前天的事。

爸妈去浩沙健身中心游泳,爸忘了带泳帽,但还是下水了。一会儿管理人员就来了。

管理员:“老先生,这里游泳要带泳帽”

爸:“喔,我忘了带了,但是(就在水里划拉了两下)我这样游脑袋在水面上,不要紧的”

管理员:“......您的泳姿不是标准的蛙泳啊”

爸:“(继续在水里划拉)这难道不像青蛙吗?”

正确的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

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

关于存档

This page is an archive of entries from 09 2010 listed from newest to oldest.

08 2010 is the previous archive.

10 2010 is the next archive.

Find recent content on the main index or look in the 存档 to find all content.