1

Angstrom Linux バージョン 3.2.18 を搭載した BeagleBone で C++ プログラムをリアルタイム優先で実行する必要があります。プログラムは pthread_setschedparam を呼び出して、その優先度を上げようとします。root としてログインすると、「操作は許可されていません」というエラーが表示されます。ただし、最初にシェル プロンプトでスーパーユーザー「su」に昇格すると、pthread_setschedparam の呼び出しは成功します。

最初に「su」を実行せずに同じ結果を得るにはどうすればよいですか? このプログラムを起動時に自動的に開始するサービスとして実行する必要があります。

4

1 に答える 1

4

(私はそれがあなたが意図したものだと思います)のマンページで、それは注の下に述べていますpthread_setschedparam

スレッドのスケジューリング ポリシーと優先順位を変更するために必要なパーミッションとその影響、および各スケジューリング ポリシーの優先順位の許容範囲の詳細については、sched_setscheduler(2) を参照してください。

そのマンページでは、以下で詳しく説明されていPrivileges and resource limitsます。

2.6.12 より前の Linux カーネルでは、特権 (CAP_SYS_NICE) プロセスのみがゼロ以外の静的優先度を設定できます (つまり、リアルタイム スケジューリング ポリシーを設定できます)。非特権プロセスが行うことができる唯一の変更は、SCHED_OTHER ポリシーを設定することです。これは、sched_setscheduler() の呼び出し元の実効ユーザー ID がターゲット プロセス (つまり、プロセスpid で指定された) ポリシーが変更されています。

Linux 2.6.12 以降、RLIMIT_RTPRIO リソース制限は、SCHED_RR および SCHED_FIFO ポリシーの非特権プロセスの静的優先度の上限を定義します。スケジュール ポリシーと優先度を変更するためのルールは次のとおりです。

  • 非特権プロセスの RLIMIT_RTPRIO ソフト リミットがゼロ以外の場合、優先度を現在の優先度の最大値と RLIMIT_RTPRIO ソフト リミットよりも高い値に設定できないという制限に従って、スケジュール ポリシーと優先度を変更できます。

  • RLIMIT_RTPRIO ソフト制限が 0 の場合、許可される変更は、優先度を下げるか、非リアルタイム ポリシーに切り替えることだけです。

  • 変更を行うプロセスの実効ユーザー ID がターゲット・プロセスの実ユーザー ID または実効ユーザー ID と一致する限り、同じ規則に従って、特権のない別のプロセスもこれらの変更を行うことができます。

  • SCHED_IDLE には特別な規則が適用されます。このポリシーの下で動作する特権のないプロセスは、RLIMIT_RTPRIO リソース制限の値に関係なく、そのポリシーを変更できません。

特権 (CAP_SYS_NICE) プロセスは RLIMIT_RTPRIO 制限を無視します。古いカーネルと同様に、スケジューリング ポリシーと優先度を任意に変更できます。RLIMIT_RTPRIO の詳細については、getrlimit(2) を参照してください。

于 2013-02-20T03:50:47.317 に答える