私はRaspberry Pi 2でArch Linuxを実行しています。
wiringPi
私は特にGordonのライブラリを使用するユーザースペースプログラムを持っています。piHiPri()
機能現在のプロセスに最も高い優先順位を設定してみてください(使用sched_setscheduler
とSCHED_RR
パターン)。この機能を使用するにはスーパーユーザー権限が必要です。
Arch Linuxをインストールすると、rootユーザーはデフォルトユーザーなので、という名前のユーザーをbuilder
作成しsudoers
ますvisudo
。
私の問題は、ユーザーとしてプログラムを実行すると、関数がroot
「sched_setscheduler
操作が許可されていません」(から取得errno
)を返すことです。
実行中に実行すると、builder
「許可を拒否」というメッセージが表示されます。
sudo myProgram
しかし、while beingで実行してみるとすべてがうまくなり、命令で優先builder
順位が変わったことがわかる。top
root
ユーザーのUIDが0ではない可能性があると考えて確認しましたが、id -u root
0が返されました。
ls -l myProgramm
-rwxr-xr-x 1 root root
私もSUIDを設定しようとしましたが、成功しませんでしたchmod +s myProgramm
。
私のプログラムをrootとして実行可能にする方法についてのアイデアはありますか?
編集する:
Gillesが提案したとおりに実行しましたが、ulimit -r
すべての場合に0(builder
および)が返されましたroot
。
1行を変更しました/etc/security/limits.conf
。* - rtprio 0
到着する:* - rtprio 99
ulimit -r
これは期待される出力に影響を与え、99を返します。
その後、プログラムを再実行してみましたが、root
まだ同じOperation not permitted
エラーが発生しました。今もう動作しませんsudo
(Operation not permitted
上記と同じ)...奇妙です!
調査中に以前の設定を復元しました/etc/security/limits.conf
。
答え1
私もこの問題のため悩みです。私の場合、dockerデーモンはデフォルトのcgroupを再設定したことがわかりました。その結果、root ユーザーの cgroup スライスはcpu.rt_runtime_us
0 に設定されます。リアルタイムスケジューラ(RRまたはFIFO)を設定するには、CPU時間を割り当てる必要があります。プロセスにその情報がない場合(cpu.rt_runtime_us
ゼロの場合)、「権限の拒否」というメッセージが表示されます。
この問題に関連するcgroupとdockerの詳細については、RedHat Bugzillaのバグレポートを参照してください。https://bugzilla.redhat.com/show_bug.cgi?id=1467919
答え2
違いを説明できる1つは、最大リアルタイム優先順位制限(ulimit -r
)が互いに異なることです。ルートはこの制限を超えることはできませんが、増やすことはできます。必要に応じて、プログラムを実行する前に制限を確認しulimit -r
(またはCで)増やしてください。getrlimit(RLIMIT_RTPRIO, …)
それでも役に立たない場合は、システム構成ではなくプログラムに問題がある可能性があります。投稿する問題を再現できる小さな、独立したソースコード、存在するスタックオーバーフロー(プログラミングは余談です。UnixとLinux)。