当以普通用户身份运行时,此调用在带有 EACCES 的 Solaris 上失败:
sem_open(fileName.c_str(), O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO, 1);
当进程以 root 身份启动时,它运行良好。这是预期的行为吗?
环境:
$ uname -a
SunOS solaris 5.11 11.0 i86pc i386 i86pc
$ g++ --version
g++ (GCC) 4.5.2
当以普通用户身份运行时,此调用在带有 EACCES 的 Solaris 上失败:
sem_open(fileName.c_str(), O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO, 1);
当进程以 root 身份启动时,它运行良好。这是预期的行为吗?
环境:
$ uname -a
SunOS solaris 5.11 11.0 i86pc i386 i86pc
$ g++ --version
g++ (GCC) 4.5.2
在命令行尝试:
prctl $$
这些是您的进程具有的系统强制资源限制。注意有
process.max-sem-ops
process.max-sem-nsems
project.max-sem-ids
这些是有数字的限制,如果您没有看到它们(或已经达到限制),那么您必须将它们添加到您的帐户配置文件中,projadd
或者projmod
如果您的项目已经存在,则增加它们。
如果您无法执行此操作(无 root 访问权限),请咨询您的系统管理员,他/她可能有某些原因不允许信号量访问。
仔细注意:
信号量是内核持久的。如果您多次运行您的代码,您创建的信号量可能仍然存在。
要查看现有信号量,请尝试ipcs -as
要删除您的代码应该删除的挥之不去的信号量,请使用ipcrm