我需要在使用Angstrom Linux版本3.2.18的BeagleBone上以实时优先级运行C ++程序。程序调用pthread_setschedparam尝试提升其优先级。以root身份登录时,出现“不允许操作”错误。但是,如果我首先在shell提示符下提升为超级用户“su”,则对pthread_setschedparam的调用成功。
如果不首先运行“su”,我怎样才能达到相同的效果?我需要将此程序作为在引导时自动启动的服务运行。
答案 0 :(得分:4)
在pthread_setschedparam
Privileges and resource limits
中(我假设这就是你的意思),它在Notes下声明:
有关更改线程的调度策略和优先级所需的权限和影响的说明,以及每个调度策略中优先级的允许范围的详细信息,请参阅sched_setscheduler(2)。
在manpage中,详细信息见{{1}}:
在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)。