读书人

有关共享内存的段异常不明白

发布时间: 2013-01-18 10:22:42 作者: rapoo

有关共享内存的段错误不明白
今天想了解下linux下的共享内存开辟,写了下面一段测试代码,结果编译运行,出现段错误。

我在gdb下调试,打印出p_map指向0xffffffff,很明显是mmap将文件映射到内存上出错了。由于p_map为0xffffffff,memcpy时会触发SIGSEGV信号,说明memcpy操作指向了一段不可用的存储区。

可是,mmap操作为何出错了呢?我查了很久,都不明白是怎么回事,请大牛指点一二。

注:文件名通过命令行参数传递的。屏蔽的代码是gdb用来查看文件大小的。


#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>


typedef struct
{
char name[4];
int age;
}people;


int main(int argc, char* argv[])
{
int fd, i;
people *p_map = NULL;
char temp;
//struct stat statbuf;


if(argc != 2)
{
return -1;
}

fd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 00777);
if(fd < 0)
{
printf("open %s failed!\n", argv[1]);
return -1;
}

lseek(fd, sizeof(people) * 5 - 1, SEEK_SET);
write(fd, "", 1);

//fstat(fd, &statbuf);

p_map = (people *)mmap(NULL, sizeof(people ) *10, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

if(p_map == NULL)
{
printf("mmap failed.\n");
return -1;
}


close(fd);

temp = 'a';

for(i = 0; i < 5; i++)
{
temp += 1;
memcpy((*(p_map + i)).name, &temp, 1);
(*(p_map + i)).age = 20 + i;
}

printf("OK!!!\n");

sleep(10);

munmap(p_map, sizeof(people) * 10);

}

[解决办法]
fd = open(argv[1], O_WRONLY
[解决办法]
O_CREAT
[解决办法]
O_TRUNC, 00777);
改成
fd = open(argv[1], O_RDWR
[解决办法]
O_CREAT
[解决办法]
O_TRUNC, 00777);

读书人网 >C语言

热点推荐