【问题标题】:shmget() gives EINVAL errorshmget() 给出 EINVAL 错误
【发布时间】:2013-03-14 01:00:16
【问题描述】:

我已经有几个小时的 shmget 问题,现在我似乎无法弄清楚。每次我尝试拨打 shmget() 时,它总是返回一个 EINVAL: "Invalid Argument" 错误。

代码的重要部分如下:

key_t generate_ipc_key()
{
    key_t ipc_key = ftok(__FILE__, KEY);
    if(ipc_key < 0) {
        perror("Failed to Generate IPC Key");
        exit(IPC_FAILURE);
    }

     return ipc_key;
}

int shared_memory_create(size_t memory_size)
{
    int shm_key = shmget(generate_ipc_key(), memory_size, IPC_CREAT | 0666);
    if(shm_key < 0) {
        perror("Failed to Create Shared Memory Key");
        exit(CREATE_FAILURE);
    }

    return shm_key;
}

函数被调用:

shm_key = shared_memory_create(sizeof(data_t));

data_t 是一个结构体:

typedef struct {
    int hCount;
    int oCount;
    int bCount;
} data_t;

如果它有助于共享内存的值是:

kernal.shmmax = 33554432
kernal.shmall = 2097152
kernal.shmmni = 4096

我对 C 还很陌生,所以我确信这是我所缺少的一些简单的东西,但我似乎无法弄清楚。任何帮助表示赞赏!

我不确定它到底是什么,ipcs 显示没有共享段,我重新启动,现在它可以工作了。

【问题讨论】:

  • 这可能会有所帮助。 EINVAL != "无效参数"。 EINVAL = 要创建一个新段并且size &lt; SHMMINsize &gt; SHMMAX,或者不创建新段,具有给定键的段存在,但大小大于该段的大小。手册页。检查memory_size 参数。
  • @Kira:我得到 errno 22,这是我系统上的 EINVAL。

标签: c linux shared-memory


【解决方案1】:

手册页说:

EINVAL A new segment was to be created and size < SHMMIN or 
size > SHMMAX, or no new segment was to be created, a 
segment with given key existed, but size is greater than 
the size of that segment.

因此,请检查其中是否适用。 您可以运行ipcs 工具来列出现有的共享内存段,并查看您的程序是否与其中任何一个发生冲突。请注意,共享内存段在您的进程结束后仍然存在。

【讨论】:

  • 我不相信 shmmni 是最小尺寸。它是可以创建的最大共享内存段数。无论如何,我同意你的其他前提,他们可能需要增加尺寸。问题是该值应该是什么。
  • 我实际上尝试了一些东西来看看这是否是问题并将其设置为关闭 2097152 并且仍然没有骰子。我实际上不认为有 SHMMIN 了,我试着寻找它显然曾经是 1 个字节。
  • @spdaley 是的,你是对的,它是常量 SHMMIN ,而不是 kernel.shmmni
猜你喜欢
  • 2013-09-06
  • 2011-09-20
  • 2017-10-17
  • 2017-01-24
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
相关资源
最近更新 更多