我正在编写一个简单的程序来分配共享内存, 以下是shmget的示例代码,
#define SHM_SIZE 1024
main(int argc,char **argv)
{
int shmId,choice;
key_t key=8888;
char *shmPtr;
size_t memSize;
shmId=shmget(key, SHM_SIZE, IPC_CREAT | 0777);
if(shmId == -1)
{
perror("shmget");
exit(1);
}
以上代码正常运行,没有任何错误,
现在,当我将 SHM_SIZE 更改为 1024 * 1024 * 1024 时 然后我在 shmget
中收到错误Error :
shmget: Invalid argument
任何人都可以帮忙,为什么会这样?
我的分配超过最大值吗?
答案 0 :(得分:3)
将评论汇编成答案。 shmget man page描述了导致EINVAL
错误的可能原因:
要创建一个新细分并且尺寸< SHMMIN或尺寸&gt; SHMMAX,或者没有创建新段,具有给定键的段,但是大小大于该段的大小。
由于您的系统配置的SHMMAX
大于请求的大小,因此错误必须归因于第二个原因。这可能是因为您首次运行较小尺寸的程序。由于共享内存在创建它的进程退出时不会自动删除,因此当程序以较大的大小再次运行时,共享内存仍然存在。如错误描述中所述,不允许在具有更大大小的现有共享内存区域上调用shmget
。