LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1080|回复: 7

求助linux下c编程的问题,跪谢。

[复制链接]
发表于 2005-8-14 12:31:25 | 显示全部楼层 |阅读模式
最近一直在看《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也可以。源程序是需要使修改映像文件反映的外存文件上。
发表于 2005-8-14 16:39:09 | 显示全部楼层
test1.dat的文件大小是多少?是零吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-15 00:42:30 | 显示全部楼层
不是0,我设置的内容是hello,谢谢。顺便说一下,我用的虚拟机,不知道是不是这个原因。
回复 支持 反对

使用道具 举报

发表于 2005-8-15 10:01:10 | 显示全部楼层
我试了一下,好像没有问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-15 14:07:34 | 显示全部楼层
谢谢楼上的兄弟,如果没有问题就是我用的虚拟机linux的问题了,我试过好几次也不行,都显示指针地址
out of bound.接着就是错误,返回;如果把参数MAP_SHARED改为MAP_PRIVATE就可以顺利运行。。你用的是VM WARE吗?
回复 支持 反对

使用道具 举报

发表于 2005-8-15 16:00:37 | 显示全部楼层
可能是Vm的问题吧,我用的不是vm
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-16 00:48:42 | 显示全部楼层
问个简单问题,我刚刚直接装的redhat9,进去时xwindows界面,怎么运行gcc编译程序?怎么写程序?谢谢:)
回复 支持 反对

使用道具 举报

发表于 2005-8-16 09:39:03 | 显示全部楼层
redhat9 刚安装好时是没有开发工具的,需要另外安装这些。
#redhat-config-packages --isodir=...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表