2011-11-13 26 views
1

我必须为C++项目制作一个信号量数组。我不打semget()main();我有一个单独的方法,使其更容易,虽然在main.cpp中的方法。当我的程序到达semget(semkey,nsems,0666|IPC_CREAT)时,它返回-1与一个EACCES errno,这显然意味着“一个信号量标识符key存在,但操作权限由semflg的低9位指定不会被授予。”为什么在创建信号量时semget()会导致EACCES错误?

我用GDB反复了我的代码。 semget()的所有三个参数看起来都正确,这是程序调用semget()的第一个点,所以信号量不存在;我甚至跑过ipcs -s来确认。我在main.cpp的顶部有#include <sys/sem.h>

这是怎么回事?我已经创建并附加了共享内存段,可能与它有关吗?我看不出如何。

+0

它是否正确地工作的第一次重新启动后? –

+0

我还没试过。那会影响到它呢?为什么? –

+0

那么,使用'ipcs'清理应该已经成功了,但可以肯定的是,重新启动系统肯定会清理任何剩余的共享资源(信号量,共享内存等)。 –

回答

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. 

提醒一下,因为信号是系统对象,它只有在一个系统调用,这是明确发出删除。 (semctlIPC_RMIDipcrm term命令)。 此外,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 
相关问题