gpt4 book ai didi

linux - 为什么由 systemd 启动的进程与以交互方式启动时的行为不同?

转载 作者:太空狗 更新时间:2023-10-29 11:19:19 28 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

关于linux - 为什么由 systemd 启动的进程与以交互方式启动时的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22050297/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com