我有一个程序,它使用以下代码生成实时线程:
schparam.sched_priority = sched_get_priority_max(SCHED_FIFO);
getrlimit(RLIMIT_RTPRIO , &rlim);
rlim.rlim_cur = schparam.sched_priority;
setrlimit(RLIMIT_RTPRIO , &rlim);
result = pthread_setschedparam(pthread_self(),SCHED_FIFO, &schparam);
if(result != 0 )
printf("failed to set priority\n");
我的默认系统限制不允许RT预定线程,因此我需要调用setrlimit来提高此值。当我登录到root shell并手动启动程序时,上面的代码可以正常工作。
但是,当我在启动时由systemd自动启动程序时,计划设置将失败并显示权限错误。 setrlimit调用似乎可以通过返回值和随后对进程内getrlimit的调用来判断。但是pthread_setschedparam调用似乎没有意识到限制已经增加。
当我手动启动程序时,这一切都正常。我在这里缺少什么?
答案 0 :(得分:1)
默认情况下,systemd设置LimitRTPRIO=0
。您可以使用systemctl show $servicename | grep LimitRTPRIO
验证该内容。
如果RLIMIT_RTPRIO软限制为0,则唯一允许的更改是降低优先级,或切换到非实时策略。
按照Siosm的建议更改LimitRTPRIO
,例如单元文件中的LimitRTPRIO=infinity
应该可以解决问题。