C 两次调用mmap时发出SIGSEGV
我正试图在Ubuntu上运行以下程序,但它因分段错误而崩溃C 两次调用mmap时发出SIGSEGV,c,linux,gcc,mmap,segmentation-fault,C,Linux,Gcc,Mmap,Segmentation Fault,我正试图在Ubuntu上运行以下程序,但它因分段错误而崩溃 #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <unistd.h> int mai
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
int main()
{
int fd, ret;
void* p1;
void* p2;
unlink ("test.file");// don't care if it doesn't exists
fd = open("test.file", O_RDWR | O_CREAT | O_SYNC, ALLPERMS);
if(fd == -1)
return errno;
ret = ftruncate(fd, 4096*16);
if(ret != 0)
return errno;
p1 = mmap(NULL, 4096*16, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if(p1 == (void*)-1)
return errno;
ret = ftruncate(fd, 4096*150);
if(ret != 0)
return errno;
// dies here!
p2 = mmap(p1 + (4096*16), 4096*(150-16), PROT_READ | PROT_WRITE, MAP_SHARED |MAP_FIXED, fd, 4096*16);
if(p2 == (void*)-1)
return errno;
return 0;
}
我想做的是给mmap打两次电话:
p1 = mmap(null, size: 16 * 4k, offset: 0);
p2 = mmap(p1+(16*4K), 136 * 4k , offset: 16 * 4k);
基本上,尝试创建两个连续的内存区域来镜像文件中的两个连续区域。
如果第二次mmap失败也没关系,但我想了解为什么它会导致分段错误
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
int main()
{
int fd, ret;
void* p1;
void* p2;
unlink ("test.file");// don't care if it doesn't exists
fd = open("test.file", O_RDWR | O_CREAT | O_SYNC, ALLPERMS);
if(fd == -1)
return errno;
ret = ftruncate(fd, 4096*16);
if(ret != 0)
return errno;
p1 = mmap(NULL, 4096*16, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if(p1 == (void*)-1)
return errno;
ret = ftruncate(fd, 4096*150);
if(ret != 0)
return errno;
// dies here!
p2 = mmap(p1 + (4096*16), 4096*(150-16), PROT_READ | PROT_WRITE, MAP_SHARED |MAP_FIXED, fd, 4096*16);
if(p2 == (void*)-1)
return errno;
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
int fd,ret;
无效*p1;
void*p2;
取消链接(“test.file”);//不在乎它是否不存在
fd=打开(“test.file”,O|RDWR | O|u CREAT | O|u SYNC,ALLPERMS);
如果(fd==-1)
返回errno;
ret=ftruncate(fd,4096*16);
如果(ret!=0)
返回errno;
p1=mmap(空,4096*16,保护读写,映射共享,fd,0);
如果(p1==(无效*)-1)
返回errno;
ret=ftruncate(fd,4096*150);
如果(ret!=0)
返回errno;
//死在这里!
p2=mmap(p1+(4096*16),4096*(150-16),保护读取,保护写入,映射共享,映射固定,fd,4096*16);
如果(p2==(无效*)-1)
返回errno;
返回0;
}
它可能会在映射前后分配保护页,以防止映射溢出,它们应该在读写时隔离错误。另一个选项是点击堆栈下的保护页。检查第一个mmap
后的pmap
输出,以确保
尝试改用
mremap
。它可能会在映射前后分配保护页,以防止映射溢出,它们应该在读写时进行故障隔离。另一个选项是点击堆栈下的保护页。检查第一个mmap
后的pmap
输出,以确保
尝试改用
mremap
。它可能会在映射前后分配保护页,以防止映射溢出,它们应该在读写时进行故障隔离。另一个选项是点击堆栈下的保护页。检查第一个mmap
后的pmap
输出,以确保
尝试改用
mremap
。它可能会在映射前后分配保护页,以防止映射溢出,它们应该在读写时进行故障隔离。另一个选项是点击堆栈下的保护页。检查第一个mmap
后的pmap
输出,以确保
试着改用
mremap
。嗨,Maxim,非常感谢,你能给我指一些参考资料来获取更多信息吗?@AyendeRahien我能够复制它,但不再使用原始源代码。可能是地址空间随机化。嗨,马克西姆,非常感谢你,你能给我指一些资源来获取更多关于这方面的信息吗?@AyendeRahien我能够复制它,但不能再使用原始源代码了。可能是地址空间随机化。嗨,马克西姆,非常感谢你,你能给我指一些资源来获取更多关于这方面的信息吗?@AyendeRahien我能够复制它,但不能再使用原始源代码了。可能是地址空间随机化。嗨,马克西姆,非常感谢你,你能给我指一些资源来获取更多关于这方面的信息吗?@AyendeRahien我能够复制它,但不能再使用原始源代码了。可能是地址空间随机化。