1

我需要在具有 Angstrom Linux 版本 3.2.18 的 BeagleBone 上以实时优先级运行 C++ 程序。该程序调用 pthread_setschedparam 以尝试提升其优先级。以 root 身份登录时,我收到“不允许操作”错误。但是,如果我首先在 shell 提示符下提升为超级用户“su”,那么对 pthread_setschedparam 的调用就会成功。

如何在不先运行“su”的情况下获得相同的结果?我需要将此程序作为在启动时自动启动的服务运行。

4

1 回答 1

4

在(我假设这就是您的意思)的联机帮助页中,它在注释下声明:pthread_setschedparam

有关更改线程调度策略和优先级所需的权限和效果的描述,以及每个调度策略中优先级允许范围的详细信息,请参阅 sched_setscheduler(2)。

该手册页中,详细说明Privileges and resource limits如下:

在 2.6.12 之前的 Linux 内核中,只有特权(CAP_SYS_NICE)进程才能设置非零静态优先级(即设置实时调度策略)。非特权进程唯一可以做的改变是设置 SCHED_OTHER 策略,并且只有当 sched_setscheduler() 调用者的有效用户 ID 与目标进程的真实或有效用户 ID 匹配时才能做到这一点(即进程由 pid 指定),其策略正在更改。

从 Linux 2.6.12 开始,RLIMIT_RTPRIO 资源限制为 SCHED_RR 和 SCHED_FIFO 策略定义了非特权进程的静态优先级上限。更改调度策略和优先级的规则如下:

  • 如果非特权进程具有非零 RLIMIT_RTPRIO 软限制,则它可以更改其调度策略和优先级,但受限于优先级不能设置为高于其当前优先级的最大值及其 RLIMIT_RTPRIO 软限制的值。

  • 如果 RLIMIT_RTPRIO 软限制为 0,则唯一允许的更改是降低优先级或切换到非实时策略。

  • 遵循相同的规则,另一个非特权进程也可以进行这些更改,只要进行更改的进程的有效用户 ID 与目标进程的真实或有效用户 ID 匹配。

  • 特殊规则适用于 SCHED_IDLE:在此策略下运行的非特权进程不能更改其策略,无论其 RLIMIT_RTPRIO 资源限制的值如何。

特权 (CAP_SYS_NICE) 进程忽略 RLIMIT_RTPRIO 限制;与旧内核一样,它们可以对调度策略和优先级进行任意更改。有关 RLIMIT_RTPRIO 的更多信息,请参见 getrlimit(2)。

于 2013-02-20T03:50:47.317 回答