我正在Raspberry Pi 2上运行Arch。
我有一个用户空间程序,它使用戈登的wiringPi库,特别是试图为当前进程设置最高优先级的piHiPri()函数 (使用sched_setscheduler和SCHED_RR模式)。此函数需要超级用户特权。
在安装Arch时,根用户是默认用户,因此我创建了一个名为builder的用户,我通过visudo将其添加到sudoers中。
我的问题是:当我与root用户一起执行程序时,sched_setscheduler函数返回“不允许的操作”(从errno获得)。
如果我在做builder时执行它,就会得到“拒绝的权限”。
但是,如果我在sudo myProgram中执行它,而我是builder,那么一切都很好,并且我可以看到top命令改变了优先级。
我认为root用户可能没有UID 0,所以我使用id -u root进行了检查,但返回0。
ls -l myProgramm给了-rwxr-xr-x 1 root root。我还尝试用chmod +s myProgramm设置SUID,但没有成功。
知道如何使我的程序通过root可执行吗?
正如吉尔斯建议的那样,我运行了ulimit -r,它在任何情况下都返回0(builder和root)。
我将/etc/security/limits.conf中的一行更改为:* - rtprio 0
致:* - rtprio 99
这就像预期的那样影响了ulimit -r的输出:它现在返回99。
然后我再次尝试用root运行我的程序,但是我仍然有相同的Operation not permitted错误,现在它不再适用于sudo (与上面相同的Operation not permitted).奇怪!
在调查时,我回到了旧的/etc/security/limits.conf设置。
发布于 2019-04-08 15:22:33
我也被这个问题击中了。在我的例子中,结果是docker守护进程已经重新配置了默认的cgroup。结果,根用户将cgroup片的cpu.rt_runtime_us设置为零。为了设置实时调度程序( RR或FIFO),您需要分配一些CPU时间。如果您的进程没有它(当cpu.rt_runtime_us为零时),您将获得“拒绝权限”。
有关与此问题相关的cgroup和docker的更多详细信息,请参阅RedHat Bugzilla:https://bugzilla.redhat.com/show_bug.cgi?id=1467919上的错误报告。
发布于 2015-06-06 22:13:10
有一件事可以解释这种区别,那就是如果你的最大实时优先级(ulimit -r)有不同的限制。根不能超过限制,但可以提高限制。检查ulimit -r (或者,在C语言中使用getrlimit(RLIMIT_RTPRIO, …) ),并在必要时在运行程序之前提高限制。
如果这没有帮助,那么它可能是程序中的一个问题,而不是您的系统配置中的问题。在复制问题的小型但独立的源代码。上发布一个堆栈溢出 (编程在Unix & Linux上是非主题的)。
https://unix.stackexchange.com/questions/207762
复制相似问题