gpt4 book ai didi

c++ - 为什么 semget() 在 *creating* 信号量时会导致 EACCES 错误?

转载 作者:太空宇宙 更新时间:2023-11-04 12:15:04 29 4
gpt4 key购买 nike

我必须为 C++ 项目创建一个信号量数组。我不调用 semget()来自 main() ;我有一个单独的方法来简化它,尽管是 main.cpp 中的一个方法.当我的程序到达 semget(semkey,nsems,0666|IPC_CREAT) ,它返回 -1 和 EACCES errno,这显然意味着“key 存在信号量标识符,但不会授予 semflg 的低 9 位指定的操作权限。”

我已经用 GDB 反复检查了我的代码。 semget() 的所有三个参数看对了,这是程序调用semget()的第一点,所以信号量还不存在;我什至跑了ipcs -s确保;确定。我有 #include <sys/sem.h>main.cpp 的顶部.

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

最佳答案

来自手册:

 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 术语命令)。此外,semkey 必须是唯一的(例如从 ftok() 函数中检索),否则可能在您第一次调用之前由另一个程序创建它符号获取。因为它会存在,所以您会捕获所谓的 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

关于c++ - 为什么 semget() 在 *creating* 信号量时会导致 EACCES 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8109641/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com