C++ 将大于页面大小的数据写入共享内存

C++ 将大于页面大小的数据写入共享内存,c++,shared-memory,mmap,C++,Shared Memory,Mmap,我的处理器的页面大小为4096。我需要将数据写入共享内存,该数据的大小为7168(7KB)。 我使用ftruncate并分配了8192(2*page_大小)以便有足够的内存 shmem_fd = shm_open( TRIAL_SHMEM_FILE, O_RDWR, S_IRUSR | S_IWUSR); if( shmem_fd == -1 ) { printf("Create_shmem, open failed:%s",strerror( errno));PASLOG retu

我的处理器的页面大小为4096。我需要将数据写入共享内存,该数据的大小为7168(7KB)。 我使用ftruncate并分配了8192(2*page_大小)以便有足够的内存

shmem_fd = shm_open( TRIAL_SHMEM_FILE, O_RDWR, S_IRUSR | S_IWUSR);
if( shmem_fd == -1 ) 
{
    printf("Create_shmem, open failed:%s",strerror( errno));PASLOG  return false;
}
if( ftruncate( shmem_fd, 8192) == -1 )
{
    printf("Create_shmem, ftruncate failed:%s",strerror( errno));PASLOG return false;
}
我写的结构如下。[767*10]字节小于[2*页大小]。但是下面的代码会导致分段错误。 如果我尝试写[767*5],它在[1页大小]之内,就不会发生崩溃。我无法知道坠机的真正原因。是否有不同的方式继续

// data to be written into shared memory
list_data item[10]; // struct size is 767 bytes
for (uiCounter=DEFAULT_VALUE_ZERO; uiCounter < 10; ++uiCounter)
{
    memset(&item[uiCounter], 0, sizeof(list_data));
}           

list_data* list_shmem;
list_shmem = (list_data *) mmap(NULL, sizeof(list_data) * 10, PROT_READ | PROT_WRITE, MAP_SHARED, shmem_fd, 0 );

if(list_shmem == MAP_FAILED)
{
    printf("mmap failsed: %s", strerror(errno));
    return false;
}

// write to shared mem
for (uiCounter = DEFAULT_VALUE_ZERO; uiCounter < 10; ++uiCounter)
{
    memcpy ( list_shmem, &item[uiCounter], sizeof(person) );
    ++list_shmem;
}

munmap(list_shmem, sizeof(list_data) * 10);
//要写入共享内存的数据
列表_数据项[10];//结构大小为767字节
用于(uiCounter=默认值;uiCounter<10;++uiCounter)
{
memset(&item[uiCounter],0,sizeof(list_data));
}           
列表\数据*列表\ shmem;
list_shmem=(list_data*)mmap(NULL,sizeof(list_data)*10,PROT_READ,PROT_WRITE,MAP_SHARED,shmem_fd,0);
if(list_shmem==MAP_失败)
{
printf(“mmap失败:%s”,strerror(errno));
返回false;
}
//写入共享内存
用于(uiCounter=默认值;uiCounter<10;++uiCounter)
{
memcpy(列表和项目[uiCounter],大小(人));
++列表(shmem);;
}
munmap(列表、尺寸)(列表数据)*10);

您的代码有几个问题:

  • 您将错误的地址传递给以下地址中的
    munmap

    list_data* list_shmem;
    list_shmem = (list_data *) mmap(...);
    
    for (uiCounter = DEFAULT_VALUE_ZERO; uiCounter < 10; ++uiCounter)
    {
        memcpy ( list_shmem, &item[uiCounter], sizeof(person) );
        ++list_shmem; // <---- invalidates list_shmem original value
    }
    
    munmap(list_shmem, sizeof(list_data) * 10);
    
    memcpy ( list_shmem, &item[uiCounter], sizeof(person) );
    
    解决方案是:

    memcpy ( list_shmem, &item[uiCounter], sizeof(item[uiCounter]) );
    

  • 解决这两个问题的一个方法是使用标准算法,而不是手工编码的循环:

        std::copy(item + DEFAULT_VALUE_ZERO, item + 10, list_shmem);
    

    加分:

    list_data item[10]; // struct size is 767 bytes
    for (uiCounter=DEFAULT_VALUE_ZERO; uiCounter < 10; ++uiCounter)
    {
        memset(&item[uiCounter], 0, sizeof(list_data));
    }  
    

    您的代码有几个问题:

  • 您将错误的地址传递给以下地址中的
    munmap

    list_data* list_shmem;
    list_shmem = (list_data *) mmap(...);
    
    for (uiCounter = DEFAULT_VALUE_ZERO; uiCounter < 10; ++uiCounter)
    {
        memcpy ( list_shmem, &item[uiCounter], sizeof(person) );
        ++list_shmem; // <---- invalidates list_shmem original value
    }
    
    munmap(list_shmem, sizeof(list_data) * 10);
    
    memcpy ( list_shmem, &item[uiCounter], sizeof(person) );
    
    解决方案是:

    memcpy ( list_shmem, &item[uiCounter], sizeof(item[uiCounter]) );
    

  • 解决这两个问题的一个方法是使用标准算法,而不是手工编码的循环:

        std::copy(item + DEFAULT_VALUE_ZERO, item + 10, list_shmem);
    

    加分:

    list_data item[10]; // struct size is 767 bytes
    for (uiCounter=DEFAULT_VALUE_ZERO; uiCounter < 10; ++uiCounter)
    {
        memset(&item[uiCounter], 0, sizeof(list_data));
    }  
    

    您的代码有几个问题:

  • 您将错误的地址传递给以下地址中的
    munmap

    list_data* list_shmem;
    list_shmem = (list_data *) mmap(...);
    
    for (uiCounter = DEFAULT_VALUE_ZERO; uiCounter < 10; ++uiCounter)
    {
        memcpy ( list_shmem, &item[uiCounter], sizeof(person) );
        ++list_shmem; // <---- invalidates list_shmem original value
    }
    
    munmap(list_shmem, sizeof(list_data) * 10);
    
    memcpy ( list_shmem, &item[uiCounter], sizeof(person) );
    
    解决方案是:

    memcpy ( list_shmem, &item[uiCounter], sizeof(item[uiCounter]) );
    

  • 解决这两个问题的一个方法是使用标准算法,而不是手工编码的循环:

        std::copy(item + DEFAULT_VALUE_ZERO, item + 10, list_shmem);
    

    加分:

    list_data item[10]; // struct size is 767 bytes
    for (uiCounter=DEFAULT_VALUE_ZERO; uiCounter < 10; ++uiCounter)
    {
        memset(&item[uiCounter], 0, sizeof(list_data));
    }  
    

    您的代码有几个问题:

  • 您将错误的地址传递给以下地址中的
    munmap

    list_data* list_shmem;
    list_shmem = (list_data *) mmap(...);
    
    for (uiCounter = DEFAULT_VALUE_ZERO; uiCounter < 10; ++uiCounter)
    {
        memcpy ( list_shmem, &item[uiCounter], sizeof(person) );
        ++list_shmem; // <---- invalidates list_shmem original value
    }
    
    munmap(list_shmem, sizeof(list_data) * 10);
    
    memcpy ( list_shmem, &item[uiCounter], sizeof(person) );
    
    解决方案是:

    memcpy ( list_shmem, &item[uiCounter], sizeof(item[uiCounter]) );
    

  • 解决这两个问题的一个方法是使用标准算法,而不是手工编码的循环:

        std::copy(item + DEFAULT_VALUE_ZERO, item + 10, list_shmem);
    

    加分:

    list_data item[10]; // struct size is 767 bytes
    for (uiCounter=DEFAULT_VALUE_ZERO; uiCounter < 10; ++uiCounter)
    {
        memset(&item[uiCounter], 0, sizeof(list_data));
    }  
    


    @因为您更改了
    列表shmem
    ,然后将其传递给
    munmap
    。我明白您对memcpy的观点,该错误是由于我在此处放置的示例代码造成的。但问题是什么呢munmap@BlueBottle注意行
    ++list\u shmem;//谢谢,我会查一查。我现在需要知道为什么我不能一次写入超过4096字节。我现在需要知道为什么我不能一次写入超过4096字节-你应该可以。@B因为你更改了
    list\u shmem
    ,然后将它传递给
    munmap
    。我明白你对memcpy的观点,这个错误是由于我放在这里的示例代码造成的。但问题是什么呢munmap@BlueBottle注意行
    ++list\u shmem;//谢谢,我会查一查。我现在需要知道为什么我不能一次写入超过4096字节。我现在需要知道为什么我不能一次写入超过4096字节-你应该可以。@B因为你更改了
    list\u shmem
    ,然后将它传递给
    munmap
    。我明白你对memcpy的观点,这个错误是由于我放在这里的示例代码造成的。但问题是什么呢munmap@BlueBottle注意行
    ++list\u shmem;//谢谢,我会查一查。我现在需要知道为什么我不能一次写入超过4096字节。我现在需要知道为什么我不能一次写入超过4096字节-你应该可以。@B因为你更改了
    list\u shmem
    ,然后将它传递给
    munmap
    。我明白你对memcpy的观点,这个错误是由于我放在这里的示例代码造成的。但问题是什么呢munmap@BlueBottle注意行
    ++list\u shmem;//谢谢,我会查一查。我现在需要知道为什么我不能一次写入超过4096字节。我现在需要知道为什么我不能一次写入超过4096字节-你应该能够。你能一步一步地调试程序并找到导致segfault的确切行吗?seffault发生在memcpy(list_shmem,&item[uiCounter],sizeof)中(list_data));行始终当计数器为6时,您能否逐步调试程序并找到导致segfault的确切行?seffault发生在memcpy(list_shmem,&item[uiCounter],sizeof(list_data));行始终当计数器为6时,您能否逐步调试程序并找到导致segfault的确切行?seffault发生在memcpy中(list_shmem,&item[uiCounter],sizeof(list_data));计数器为6时始终行您能否逐步调试程序并找到导致segfault的确切行?seffault发生在memcpy(list_shmem,&item[uiCounter],sizeof(list_data));计数器为6时始终行