【问题标题】:C linux shmget Invalid argumentC linux shmget 参数无效
【发布时间】:2017-05-02 17:27:55
【问题描述】:
int shmCreate(int id, int size)
{
    int shmid
    key_t key;

    if ((key = ftok(".", id)) == -1) {
        perror("ftok");
        exit(1);
    }

    if ((shmid = shmget(key, size, IPC_CREAT | 0666)) == -1) {
        perror("shmget");
        exit(1);
    }

    return shmid;
}

我正在尝试编写使用shmget 的函数,其中函数将大小作为参数。我一直收到 Invalid argument 错误,除了 size = 1。当我传递大小不是 1 时,我得到错误,但是当我检查 ipcs -m 时创建了内存段,它的大小为 1。怎么办我摆脱了这个错误?

【问题讨论】:

  • key 的值是多少?即你确定ftok 没有失败?
  • 你的代码到底是什么。我刚刚使用了大小为 25 的代码,它运行良好。
  • POSIX shmget() 记录了 EINVAL 的两种情况: [EINVAL] 将创建一个共享内存段,并且 size 的值小于系统规定的最小值或大于系统规定的最小值-imposed maximum[EINVAL] 不创建共享内存段,并且为 key 存在共享内存段,但与其关联的段的大小小于 size。 你有调查了您的内核配置中的限制是什么?您是否创建了大小为 1 的细分,但现在无法增长它?
  • 只是出于好奇,id 的值是多少。我希望它不是零。
  • 这不可能是您的全部功能,因为int shmid 缺少尾随分号。

标签: c linux memory shared


【解决方案1】:

根据 shmget(2) 的手册页:

EINVAL 给定键的段存在,但大小大于 该段的大小。

您不能附加已存在且尺寸较大的分段。因此,您需要先将其删除或使用其他密钥。

【讨论】:

    猜你喜欢
    • 2013-02-08
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多