如何使用特定的数组大小创建共享内存?

时间:2017-04-15 12:30:16

标签: c linux ipc shared-memory

我有一个关于共享内存和分段错误的问题。 我认为使用大尺寸的内存会很好。 当我检查Shmmax时,我发现可以分配巨大的内存。

数据下的

是$ ipcs -lm

的结果

------共享内存限制--------

最大段数= 4096

最大段大小(千字节)= 18014398509465599

最大总共享内存(千字节)= 18014398442373116

min seg size(bytes)= 1

#include <stdio.h>
#include <sys/shm.h>
#include <sys/ipc.h> 
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>

#define ARRAY_SIZE 40000000


int main(int argc, char *argv[]){

    int shmid;
    void *shared_memory = (void *)0;
    shmid = shmget((key_t)1234, sizeof(float), IPC_CREAT|0666);
    if (shmid == -1)
    {
        perror("shmget failed : ");
        exit(0);
    }

    shared_memory = (float *)shmat(shmid, NULL, 0);
    if (shared_memory == (void *)-1)
    {
        perror("shmat failed : ");
        exit(0);
    }

    static float *testx;
    testx = (float *)shared_memory;

    int k = 0;
    for(k;k<400;k++){
        testx[k] = 1.12;
    }
    for(k;k<40000000;k++){
        testx[k] = 1.12;
    }
}

程序可以运行第一个具有少量大小的for循环

然而,问题是第二个循环,大小为40,000,000

任何建议我应该编辑什么来运行此代码?

1 个答案:

答案 0 :(得分:2)

SEGFAULT的原因是您没有使用shmget创建足够大小的细分受众群。

您传递给shmget的参数大小为sizeof(float),这足以存储1个浮点数。

你需要做的就是像这样调用shmget -

shmget((key_t)1234, sizeof(float)*40000000, IPC_CREAT|0666);

然后你可以正确使用所有内存。

较小的400循环工作的原因是shmget创建了PAGE_SIZE的倍数的分段。

所以即使你通过了sizeof(float),它也只分配了至少1页,足以容纳400个浮点数而不是40000000个。

我希望能够解决这个困惑。