有关共享内存的段错误不明白
今天想了解下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);