我必须为C ++项目创建一个信号量数组。我没有从semget()
致电main()
;虽然是main.cpp
中的一种方法,但我有一个单独的方法可以让它变得更容易。当我的程序到达semget(semkey,nsems,0666|IPC_CREAT)
时,它返回-1并带有EACCES errno,这显然意味着“key
存在一个信号量标识符,但是{{1}的低位9位指定的操作权限不会被授予。“
我用GDB重复了我的代码。 semflg
的所有三个参数看起来都是正确的,这是程序调用{{1}}的第一个点,因此信号量不存在;我甚至跑semget()
来确定。我在semget()
的顶部有ipcs -s
。
这里发生了什么?我已经创建并附加了一个共享内存段,可能与它有关吗?我看不出怎么样。
答案 0 :(得分:1)
从手册:
EACCES A semaphore set exists for key, but the calling process does not have permission to
access the set, and does not have the CAP_IPC_OWNER capability.
提醒一下,由于信号量是系统对象,因此只有在为此明确发出系统调用时才会删除它。 (semctl
IPC_RMID
或ipcrm
期限命令)。
此外,semkey
必须是唯一的(例如,从ftok()
函数检索),或者在您第一次调用semget
之前,其他程序可能会创建它。因为,它会存在,你会发现所谓的EACCES
错误,因为并非所有程序都像你一样对信号量使用0666权限。
重新启动会刷新共享对象池(信号量,共享内存段,消息队列),如下所示:
#!/bin/bash
for i in `ipcs -s | cut -f 2 -d ' '`
do
ipcrm -s $i
done
for i in `ipcs -m | cut -f 2 -d ' '`
do
ipcrm -m $i
done
for i in `ipcs -q | cut -f 2 -d ' '`
do
ipcrm -q $i
done