getpriority() - Unix 和 Linux 系統呼叫
廣告
名稱getpriority、setpriority - 獲取/設定程式排程優先順序語法
#include <sys/time.h>
#include <sys/resource.h>
int getpriority(int which, int who);
int setpriority(int which, int who, int prio); 描述透過 which 和 who 指定的程序、程序組或使用者的排程優先順序可以透過 getpriority() 呼叫獲取,並透過 setpriority() 呼叫設定。which 的值可以是 PRIO_PROCESS、PRIO_PGRP 或 PRIO_USER,而 who 則根據 which 的值進行解釋(對於 PRIO_PROCESS 為程序識別符號,對於 PRIO_PGRP 為程序組識別符號,對於 PRIO_USER 為使用者 ID)。who 為零表示(分別)呼叫程序、呼叫程序的程序組或呼叫程序的真實使用者 ID。Prio 是 -20 到 19 之間的值(但請參閱下面的註釋)。預設優先順序為 0;較低的優先順序會導致更有利的排程。 getpriority() 呼叫返回指定程序中任何一個程序的最高優先順序(最低數值)。setpriority() 呼叫將所有指定程序的優先順序設定為指定值。只有超級使用者可以降低優先順序。 返回值由於 getpriority() 可以合法地返回 -1,因此在呼叫之前需要清除外部變數 errno,然後在之後檢查它以確定 -1 是錯誤還是合法值。如果 setpriority() 呼叫沒有錯誤,則返回 0,否則返回 -1。錯誤
| 標籤 | 描述 |
|
EINVAL |
which 不是 PRIO_PROCESS、PRIO_PGRP 或 PRIO_USER 之一。 |
|
ESRCH | 使用指定的 which 和 who 值找不到任何程序。 |
| 除了上面指出的錯誤之外,如果 setpriority() 可能會失敗 |
|
EPERM | 找到一個程序,但其有效使用者 ID 與呼叫者的有效或真實使用者 ID 均不匹配,並且沒有特權(在 Linux 上:沒有 CAP_SYS_NICE 功能)。但請參閱下面的註釋。 |
|
EACCES | 呼叫者嘗試降低程序優先順序,但沒有所需的許可權(在 Linux 上:沒有 CAP_SYS_NICE 功能)。從 Linux 2.6.12 開始,此錯誤僅在呼叫者嘗試將程序優先順序設定為目標程序的 RLIMIT_NICE 軟資源限制範圍之外時才會發生;有關詳細資訊,請參閱 getrlimit(2)。 |
註釋由 fork(2) 建立的子程序繼承其父程序的 nice 值。nice 值在 execve(2) 中保留。EPERM 條件的詳細資訊取決於系統。以上描述是 POSIX.1-2001 中所說的,似乎在所有類 System V 系統上都遵循。2.6.12 之前的 Linux 核心要求呼叫者的真實或有效使用者 ID 與程序 who 的真實使用者匹配(而不是其有效使用者 ID)。Linux 2.6.12 及更高版本要求呼叫者的有效使用者 ID 與程序 who 的真實或有效使用者 ID 匹配。所有類 BSD 系統(SunOS 4.1.3、Ultrix 4.2、4.3BSD、FreeBSD 4.3、OpenBSD-2.5、...)的行為與 Linux >= 2.6.12 相同。 實際優先順序範圍因核心版本而異。1.3.36 之前的 Linux 具有 -infinity..15。從核心 1.3.43 開始,Linux 的範圍為 -20..19。在核心中,nice 值實際上使用相應的範圍 40..1 表示(因為負數是錯誤程式碼),這些值由 setpriority() 和 getpriority() 系統呼叫使用。這些系統呼叫的 glibc 包裝函式根據公式 unice = 20 - knice 處理使用者空間和核心表示的 nice 值之間的轉換。 在某些系統上,nice 值的範圍為 -20..20。 包含 <sys/time.h> 現在已經不再需要,但可以提高可移植性。(實際上,<sys/resource.h> 定義了 rusage 結構,該結構具有在 <sys/time.h> 中定義的 struct timeval 型別的欄位。) 符合標準SVr4、4.4BSD(這些函式呼叫首次出現在 4.2BSD 中)、POSIX.1-2001。參見
廣告
|