mmap函数第二个参数,映射区长度有什么用?
12main(){13structstatbuf;14intfd,pid;15char*p;18if((fd=open("abc",O_CREAT|O_RDWR))<0)...
12 main(){
13 struct stat buf;
14 int fd,pid;
15 char *p;
18 if((fd=open("abc",O_CREAT|O_RDWR))<0){
19 printf("open error\n");
20 }
21 ftruncate(fd,5);
22 if(fstat(fd,&buf)<0){
23 printf("stat error\n");
24 }
25 printf("size is %d\n",(size_t)(buf.st_size));
27 p=(char *)mmap(NULL, 2, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
31 strcpy(p,"123456");
35 close(fd);
36 if((pid=fork())<0){
37 printf("fork error");
38 }
39 else if(pid==0){
40 int fd2;
41 char *q;
43 if((fd2=open("abc",O_RDWR))<0){
44 printf("open error\n");
45 }
47 q=(char *)mmap(NULL, 2, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);
48 printf("child:%s\n",q);
51 exit(EXIT_SUCCESS);
52 }
53
54 sleep(5);
55 printf("father:%s\n",p);
56
57 }
18--21父进程中打开文件abc,大小为5字节
27通过mmap将文件映射到内存中,mmap第二个参数是2
31给mmap得到的指针空间赋值字符串“123456”
43--47在子进程中,通过mmap打开共享内存,mmap第二个参数依然是2
48为什么打印的结果是123456呢?此时文件abc里的内容是12345。
mmap()第二个参数len的意思是将文件从偏移位处映射len个长度到进程的地址空间中,可是我父子进程中,mmap第二个参数给的都是2,小于文件长度5,为什么我在子进程中读取共享内存的内容,能读到“123456”这么多个字节内容呢?这样,这个len有什么用啊,即使我写入内存的内容大于len的长度,进程间照样能完全读到啊?
谁能帮我解惑! 展开
13 struct stat buf;
14 int fd,pid;
15 char *p;
18 if((fd=open("abc",O_CREAT|O_RDWR))<0){
19 printf("open error\n");
20 }
21 ftruncate(fd,5);
22 if(fstat(fd,&buf)<0){
23 printf("stat error\n");
24 }
25 printf("size is %d\n",(size_t)(buf.st_size));
27 p=(char *)mmap(NULL, 2, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
31 strcpy(p,"123456");
35 close(fd);
36 if((pid=fork())<0){
37 printf("fork error");
38 }
39 else if(pid==0){
40 int fd2;
41 char *q;
43 if((fd2=open("abc",O_RDWR))<0){
44 printf("open error\n");
45 }
47 q=(char *)mmap(NULL, 2, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);
48 printf("child:%s\n",q);
51 exit(EXIT_SUCCESS);
52 }
53
54 sleep(5);
55 printf("father:%s\n",p);
56
57 }
18--21父进程中打开文件abc,大小为5字节
27通过mmap将文件映射到内存中,mmap第二个参数是2
31给mmap得到的指针空间赋值字符串“123456”
43--47在子进程中,通过mmap打开共享内存,mmap第二个参数依然是2
48为什么打印的结果是123456呢?此时文件abc里的内容是12345。
mmap()第二个参数len的意思是将文件从偏移位处映射len个长度到进程的地址空间中,可是我父子进程中,mmap第二个参数给的都是2,小于文件长度5,为什么我在子进程中读取共享内存的内容,能读到“123456”这么多个字节内容呢?这样,这个len有什么用啊,即使我写入内存的内容大于len的长度,进程间照样能完全读到啊?
谁能帮我解惑! 展开
2个回答
展开全部
长度单位是 以字节为单位,不足一内存页按一内存页处理
而内存页的大小,是由你的硬件,操作系统共同决定的。一般4K的比较多。
所以当你的len 小于内存页长度的时候,会按照内存页大小映射。
超过一个不足2个,会按照2个内存页分配。
而内存页的大小,是由你的硬件,操作系统共同决定的。一般4K的比较多。
所以当你的len 小于内存页长度的时候,会按照内存页大小映射。
超过一个不足2个,会按照2个内存页分配。
追问
谢谢
那我想问,这个参数没有多大意义啊
假如我能确保,共享内存中存储的内容不会大于一个pagesize,那这个参数我设置为1字节,也无所谓了,反正,都会按一个pagesize处理?
还有我映射的文件大小是5字节,存储进文件的也只是“12345”,为什么子进程中通过打开共享内存,读到的依然是“123456”?那这么说,文件大小不会影响到我在共享内存里存储的数据的大小?
追答
1 是这样的,不过如果你mmap的文件比较大,超过了一个Page 那这个参数就有意义了。
2 设置共享内存的时候,同样是以页为单位的,所以看起来是设置了2,实际上还是你内存页大小。
如果你文件大于页大小,那么这里才会出现区别,而且区别是在一页之后,在一页以内,还是没区别的。
2015-07-23
展开全部
model' => $model, // Your model
attribute' => 'news_date', // Attribute for input
options' => array(
dateFormat' => 'yy-mm-dd',
changeYear'=> 'true',
changeMonth'=> 'true',
yearRange'=> '1900:2099',
showOn' => 'both',
buttonText' => 'Click',
)
attribute' => 'news_date', // Attribute for input
options' => array(
dateFormat' => 'yy-mm-dd',
changeYear'=> 'true',
changeMonth'=> 'true',
yearRange'=> '1900:2099',
showOn' => 'both',
buttonText' => 'Click',
)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询