我有2个进程P1和P2。 P1以root身份运行,并通过以下调用创建信号量:
semget(key,1,S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH | IPC_CREAT);
我正试图在另一个进程P2中获取相同信号量的句柄,该进程在普通用户的上下文中运行。在此过程中,semget调用成功,但semop调用失败并显示“Permission Denied”(Errno = 13)。
任何指针都会有很大的帮助。
〜PS7
答案 0 :(得分:1)
此条目有很长时间,但我遇到了与
相同的问题0600 | IPC_CREAT
但我已修复使用 sudo
运行我的应用程序答案 1 :(得分:0)
我们谈论的语言是什么?
我认为导入S_常量时会出现一些错误,因此它们为空并且不起作用。
使用位掩码进行粗暴测试怎么样?
请直接尝试使用IPC_CREAT | 0666
我的2美分:)
答案 2 :(得分:0)
“权限被拒绝”/ EACCES
当然与非特权进程P2
一致,试图semget
现有的信号量无法访问。所以,也许在 key 下已经有一个现存的信号量,它缺少所需的S_IWOTH|S_IROTH
权限。 (也许是P1
早期版本的残余?)
ipcs -s
说信号量的权限是什么?如果您在IPC_EXCL
的{{1}}来电中添加semget
会怎样?它会失败吗?
答案 3 :(得分:0)
使用S_IRUSR和S_IWUSR为所有者指定读写权限 共享内存段,S_IROTH和S_IWOTH指定读写权限 其他标志作为shmget()中的第三个争论。
IPC_CREATE仅保证应创建与密钥值对应的新共享内存段。如果使用键值指定的段存在,则shmget()通常会失败。