5

我有一个程序,它使用如下代码生成一个实时线程:

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 在启动时自动启动程序时,计划设置失败并出现权限错误。根据返回值和进程内对 getrlimit 的后续调用判断,setrlimit 调用似乎有效。但是 pthread_setschedparam 调用似乎没有意识到限制已经增加。

当我手动启动程序时,这一切都很好。我在这里想念什么?

4

1 回答 1

4

默认情况下,systemd 设置LimitRTPRIO=0. 您可以使用systemctl show $servicename | grep LimitRTPRIO.

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

按照 Siosm 的建议进行更改LimitRTPRIO,例如LimitRTPRIO=infinity在您的单元文件中进行更改应该可以解决问题。

于 2017-04-24T14:47:55.337 回答