我在“shmget”系统调用中可以使用的最大大小是多少? (获得共享内存)

时间:2016-06-06 06:06:45

标签: c shared-memory

我正在编写一个简单的程序来分配共享内存, 以下是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

任何人都可以帮忙,为什么会这样?

我的分配超过最大值吗?

1 个答案:

答案 0 :(得分:3)

将评论汇编成答案。 shmget man page描述了导致EINVAL错误的可能原因:

  

要创建一个新细分并且尺寸< SHMMIN或尺寸&gt; SHMMAX,或者没有创建新段,具有给定键的段,但是大小大于该段的大小。

由于您的系统配置的SHMMAX大于请求的大小,因此错误必须归因于第二个原因。这可能是因为您首次运行较小尺寸的程序。由于共享内存在创建它的进程退出时不会自动删除,因此当程序以较大的大小再次运行时,共享内存仍然存在。如错误描述中所述,不允许在具有更大大小的现有共享内存区域上调用shmget