Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 两次调用mmap时发出SIGSEGV_C_Linux_Gcc_Mmap_Segmentation Fault - Fatal编程技术网

C 两次调用mmap时发出SIGSEGV

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

我正试图在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 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我能够复制它,但不能再使用原始源代码了。可能是地址空间随机化。