为什么systemd启动的进程与交互式启动时的行为不一样?

时间:2014-02-26 18:40:30

标签: linux pthreads systemd

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

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调用似乎没有意识到限制已经增加。

当我手动启动程序时,这一切都正常。我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

默认情况下,systemd设置LimitRTPRIO=0。您可以使用systemctl show $servicename | grep LimitRTPRIO验证该内容。

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

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