为了好好理解globalfifo这个驱动程序,自己写了两个个简单的测试程序,一个循环的写,一个循环的读,结果循环写工作正常,循环读只有第一次正常。读函数如下
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/ioctl.h> #include<memory.h> #include<fcntl.h> int main() { int i=100; int fd0; int ret_r=0, ret_w=0; char r[10]; printf("i = %d\n",i); printf("open: /dev/globalfifo...\n"); fd0 = open("/dev/globalfifo", O_RDONLY/*|O_NONBLOCK*/); if(fd0 < 0) { perror("open device globalfifo err!\n"); exit(1); } while(i) { printf("i = %d\n",i); ret_r = read(fd0, r, 10); printf("ret_r = %d",ret_r); if(ret_r < 0) { printf("read from glbalfifo error!,%d\n",ret_r); exit(1); } else if(ret_r == 0)//为什么从来没有返回0的时候呢,即使读到文件的末尾 printf("Read empty!"); else { printf("read out char num:%d\n",ret_r); printf("read from the globalmem: %s\n",r);
//原来是用的memset(r,0,10*sizeof('a')),结果第二次循环的时候i的值
//总是变成-1.挨条语句注释掉测试,才发现问题在这里
memset(r, 0, sizeof(r));
//后来加了下面的测试语句,才算明白
printf("sizeof('a') = %d;sizeof(char) =%d;sizeof(r) =%d \n",sizeof('a'),sizeof(char),sizeof(r)); usleep(2000000); } i--; printf("i = %d\n",i); } close(fd0); return 0; } |
问题1
memset(r,0,10*sizeof('a')),r只占用10个byte,而10*sizeof('a')把40byte的空间都置0了。。。。
测试语句的输出:sizeof('a') = 4;sizeof(char) =1 ;sizeof(r) =10
问题2
read函数从来就没有返回过0
我写入10个byte,读出10byte,或者不写,直接读都不会返回0,而是-1;
问题3
sizeof("aaaaa")为什么编译不过呢?
阅读(1638) | 评论(0) | 转发(0) |