|
最近一直在看《linux下c编程》书上好多例子都有问题。最近遇到一个问题,查了一些资料还是没有发现怎么回事,请知道的兄弟姐妹帮帮忙,先多谢了。
源文件比较常,问题出在mmap()函数的参数上面
简单程序如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
main()
{
int fd;
void *start;
struct stat sb;
fd=open("test1.dat",O_RDWR, 0640); /*打开/etc/passwd*/
fstat(fd,&sb); /*取得文件大小*/
start=mmap(NULL,sb.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(start==MAP_FAILED) /*判断是否映射成功*/
return;
printf("%s",start);
munmap(start,sb.st_size); /*解除映射*/
close(fd);
}
先建立test1.dat内容hello,运行结果失败,在gdb调试发现start地址为oxffffffff.
经过多次测试发现是mmap函数的 MAP_SHARED和MAP_PRIVATE的问题
如果将MAP_SHARED改为MAP_PRIVATE就可以顺利运行。
此程序为我举的简单例子,实际不需要mmap函数的参数为MAP_SHARED也可以。源程序是需要使修改映像文件反映的外存文件上。 |
|