【问题标题】:EINVAL when calling semget() under LinuxLinux下调用semget()时的EINVAL
【发布时间】:2013-02-28 17:32:11
【问题描述】:

为什么我不能为它的信号量集打开带有 4 个信号量的 semget? 即:

semget(key_t key, int nsems, int semflg); 

使用 nsms 为 3 调用上述函数很好,但使用 4 它返回负 1..

int sempahore = semget((key_t)key,4,IPC_CREAT | MY_PERMS);

以上代码仅在我将 4 更改为 3 时才有效

否则 errno 返回无效参数

【问题讨论】:

  • 你能添加你正在尝试执行的真实代码,以及调用失败后errno的值吗?因为 errno 将指示发生的错误,并且 9/10 您正在使用的参数与错误之间存在关系。
  • 我做到了,谢谢,请立即阅读:C

标签: c++ linux ipc semaphore


【解决方案1】:

根据我的 Linux 机器上的手册页,semget 可以返回 EINVAL 如果“nsems 小于 0 或大于每个信号量集的信号量数量限制 (SEMMSL),或者对应的信号量集to key 已经存在,并且 nsems 大于该集合中的信号量。"

我怀疑您遇到了第二种情况 - 检查您是否已经创建了一个具有相同键和 3 个信号量的集合。

【讨论】:

  • 有趣的是,ipcs 可用于调查现有信号量集,ipcrm 可用于手动删除它们。
猜你喜欢
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多