我有一个关于共享内存和分段错误的问题。 我认为使用大尺寸的内存会很好。 当我检查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任何建议我应该编辑什么来运行此代码?
答案 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个。
我希望能够解决这个困惑。