0

我有 2 个进程 P1 和 P2。P1 以 root 身份运行,并通过以下调用创建信号量:

semget(键,1,S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH | IPC_CREAT);

并试图在另一个进程 P2 中获取相同信号量的句柄,该进程在普通用户的上下文中运行。在此过程中,semget 调用成功,但 semop 调用失败并显示“Permission Denied”(Errno = 13)。

任何指针都会有很大帮助。

~ps7

4

4 回答 4

1

这个条目有很长时间,但我遇到了同样的问题

0600 | IPC_CREAT

但我已经修复了使用sudo运行我的应用程序

于 2012-05-05T03:24:36.787 回答
1

当然, “Permission denied”/与试图访问它无法访问的现有信号量的EACCES非特权进程一致。因此,也许该键下已经存在一个缺少所需权限的信号量。(也许是早期版本的残余?)P2semgetS_IWOTH|S_IROTHP1

ipcs -s信号量的权限是什么?如果你添加IPC_EXCL到你的semgetcall in会发生什么P1?会失败吗?

于 2009-08-12T03:19:02.180 回答
1

使用 S_IRUSR 和 S_IWUSR 指定共享内存段所有者的读写权限,而 S_IROTH 和 S_IWOTH 指定其他标志的读写权限作为 shmget() 中的第三个参数。

IPC_CREATE 只保证应该根据键值创建新的共享内存段。如果使用键值指定的段存在,通常 shmget() 会失败。

于 2009-10-08T13:04:00.077 回答
0

我们正在谈论的语言是什么?

我认为导入 S_ 常量存在一些错误,因此它们为空且无效。

使用位掩码的蛮力测试怎么样?直接尝试使用IPC_CREAT | 0666

我的 2 美分 :)

于 2009-07-10T16:42:49.230 回答