2013-02-20 70 views
0

我需要在實時優先級與埃版本的Linux 3.2.18一個BeagleBone運行C++程序。該程序調用pthread_setschedparam嘗試提升其優先級。以root身份登錄時,出現「操作不允許」錯誤。但是,如果我第一次提升到超級用戶「蘇」在shell提示符下,調用pthread_setschedparam是成功的。如何獲得許可pthread_setschedparam

我怎樣才能做到不運行「蘇」第一次相同的結果?我需要將該程序作爲在啓動時自動啓動的服務運行。

回答

3

manpagepthread_setschedparam(我認爲這就是你的意思),這說明下稱:

有關所需的權限的描述,和效果,改變線程的調度策略和優先級和用於在每個調度優先政策允許的範圍的詳細內容,請參見sched_setscheduler(2)。

that manpage,它Privileges and resource limits下詳述:

在2.6.12的Linux內核之前,只有特權(CAP_SYS_NICE)過程可以設置一個非零的靜態優先級(即設置了實時調度策略)。非特權進程唯一可以做出的改變是設置SCHED_OTHER策略,並且這隻能在sched_setscheduler()的調用者的有效用戶標識符與目標進程的真實或有效用戶標識(即進程由pid指定)其策略正在更改。

由於Linux 2.6.12,該RLIMIT_RTPRIO資源限制定義了一個非特權進程的爲SCHED_RR和SCHED_FIFO策略靜態優先級上限。對於不斷變化的調度策略和優先級的規則如下:

  • 如果一個非特權進程具有非零RLIMIT_RTPRIO軟限制的話,就可以改變它的調度策略和優先級,受該優先級不能設置限制到比最大其當前優先級和其RLIMIT_RTPRIO軟極限的更高的值。

  • 如果RLIMIT_RTPRIO軟限制爲0,則唯一允許的更改是降低優先級或切換到非實時策略。

  • 根據相同的規則,只要進行更改的進程的有效用戶標識與目標進程的實際或有效用戶標識匹配,另一個非特權進程也可以進行這些更改。

  • 特殊規則適用於SCHED_IDLE:在此策略下運行的非特權進程不能更改其策略,無論其RLIMIT_RTPRIO資源限制的值如何。

特權(CAP_SYS_NICE)進程忽略RLIMIT_RTPRIO限制;與舊內核一樣,他們可以對調度策略和優先級進行任意更改。有關RLIMIT_RTPRIO的更多信息,請參閱getrlimit(2)。