为什么在创建*信号量时semget()会导致EACCES错误?

时间:2011-11-13 04:37:50

标签: c++ unix permissions ipc semaphore

我必须为C ++项目创建一个信号量数组。我没有从semget()致电main();虽然是main.cpp中的一种方法,但我有一个单独的方法可以让它变得更容易。当我的程序到达semget(semkey,nsems,0666|IPC_CREAT)时,它返回-1并带有EACCES errno,这显然意味着“key存在一个信号量标识符,但是{{1}的低位9位指定的操作权限不会被授予。“

我用GDB重复了我的代码。 semflg的所有三个参数看起来都是正确的,这是程序调用{​​{1}}的第一个点,因此信号量不存在;我甚至跑semget()来确定。我在semget()的顶部有ipcs -s

这里发生了什么?我已经创建并附加了一个共享内存段,可能与它有关吗?我看不出怎么样。

1 个答案:

答案 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_RMIDipcrm期限命令)。 此外,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