次のようなコードでリアルタイム スレッドを生成するプログラムがあります。
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 を呼び出してこの値を上げる必要があります。上記のコードは、ルート シェルにログインしてプログラムを手動で起動すると、希望どおりに機能します。
しかし、起動時にsystemdでプログラムを自動起動させると、スケジュール設定がパーミッションエラーで失敗してしまいます。setrlimit 呼び出しは、戻り値とその後のプロセス内の getrlimit への呼び出しから判断すると、機能しているように見えます。しかし、pthread_setschedparam 呼び出しは、制限が引き上げられたことを認識していないようです。
繰り返しますが、プログラムを手動で起動すると、これはすべて正常に機能します。ここで何が欠けていますか?