GETPRIORITY(2)

名前
getpriority, setpriority - プログラムのスケジューリングの優先度を取得/設定する

書式
#include <sys/time.h>
#include <sys/resource.h>

int getpriority(int which, id_t who);
int setpriority(int which, id_t who, int prio);

説明
The scheduling priority of the process, process group, or user, as indicated by which and who is obtained with the getpriority() call and set with the setpriority() call. The process attribute dealt with by these system calls is the same attribute (also known as the "nice" value) that is dealt with by nice(2).

which の値は PRIO_PROCESS, PRIO_PGRP, PRIO_USER, のどれか一つで、 who は which に応じて解釈される (PRIO_PROCESS だとプロセス識別子、 PRIO_PGRP だとプロセスグループ識別子、 PRIO_USER だと UID (ユーザーID) と解釈される)。 who がゼロならば、(それぞれ)呼び出したプロセス、 呼び出したプロセスのプロセスグループ、 呼び出したプロセスの実UID を意味する。

prio 引数は -20 から 19 の範囲の値で (但し以下の「注意」を参照)、 -20 が最高優先度で、 19 が最低優先度である。優先度をこの範囲外に設定しようとした場合は、値は黙ってこの範囲となる。デフォルトの優先度は 0 である; 小さな数字ほど、プロセスのスケジューリング優先度が高くなる。

getpriority() コールは指定したプロセスの中の最も高い優先度 (数値的には最小の値) を返す。 setpriority() コールは指定したプロセス全ての優先度を指定した値に設定する。

Traditionally, only a privileged process could lower the nice value (i.e., set a higher priority). However, since Linux 2.6.12, an unprivileged process can decrease the nice value of a target process that has a suitable RLIMIT_NICE soft limit; see getrlimit(2) for details.

返り値
On success, getpriority() returns the calling thread's nice value, which may be a negative number. On error, it returns -1 and sets errno to indicate the cause of the error.

getpriority() は成功した場合にも -1 の値を返す可能性があるので、 呼び出しの前に外部変数の errno をクリアし、呼び出しの後に返り値の -1 が正当な値か エラーかを判別する必要がある。

成功すると、 setpriority() は 0 を返す。 エラーの場合、-1 を返し、 errno にエラーの原因を示す値を設定する。

エラー

EINVAL
    which が PRIO_PROCESS, PRIO_PGRP, PRIO_USER のいずれでもない。

ESRCH
    which と who で指定されたプロセスが存在しない。

上記のものに加えて setpriority() では以下のエラーがある:

EACCES
    The caller attempted to set a lower nice value (i.e., a higher process priority), but did not have the required privilege (on Linux: did not have the CAP_SYS_NICE capability).

EPERM
    プロセスは見つかったが、そのプロセスの実効 (effective) UID が 呼び出し元の実効UID にも実 (real) UID にも一致せず、 呼び出し元が特権も持っていなかった (Linux の場合、 CAP_SYS_NICE ケーパビリティがなかった)。 以下の「注意」も参照のこと。

準拠
POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD (これらのインターフェースは 4.2BSD で初めて登場した)

注意
nice 値の詳細は sched(7) を参照のこと。

Note: the addition of the "autogroup" feature in Linux 2.6.38 means that the nice value no longer has its traditional effect in many circumstances. For details, see sched(7).

fork(2) で作成された子プロセスは、 親プロセスの nice 値を継承する。 execve(2) の前後で nice 値は保存される。

EPERM が発生する条件の詳細はシステムに依存する。 上記の説明は POSIX.1-2001 のものであり、全ての System V 風システムは これに従っているようである。 2.6.12 より前の Linux カーネルでは、呼び出し元の実 UID または 実効 UID がプロセス who の (実効 UID でなく) 実 UID に一致する必要がある。 Linux 2.6.12 以降では、呼び出し元の実行 UID がプロセス who の実 UID か実効 UID のいずれかと一致する必要がある。 全ての BSD 風システム (SunOS 4.1.3, Ultrix 4.2, 4.3BSD, FreeBSD 4.3, OpenBSD-2.5等) は、 Linux 2.6.12 以降と同じ動作をする。

現在では <sys/time.h> をインクルードする必要はないが、インクルードすれば移植性を高めることができる (実際には <sys/resource.h> で rusage 構造体が定義されているが、そのフィールドで使用されている struct timeval 型は <sys/time.h> で定義されている)。

  C ライブラリとカーネルの違い
カーネル内部では、nice 値は実際には 40 〜 1 の範囲を使って 表現されており (負の値はエラーコードとなるため)、こちらの値が システムコール setpriority() と getpriority() で使用されている。 glibc のこれらのシステムコールのラッパー関数において、nice 値の ユーザー領域 (user-land) とカーネル表現の間の変換が行われる。 変換式は unice = 20 - knice となる。 (したがって、カーネルの 40..1 の範囲はユーザー空間で見える -20..19 の範囲に対応する。)

バグ
POSIX では nice 値はプロセス単位の設定となっている。 一方、 現在の POSIX スレッドの Linux/NPTL 実装では、 nice 値はスレッド単位の属性である。 同じプロセスの別々のスレッドが異なる nice 値を持つ場合がある。 移植性が必要なアプリケーションではこの Linux の動作を前提するのは避けるべきである。 Linux の動作は将来標準に準拠した動作になるかもしれない。

関連項目
nice(1), renice(1), fork(2), capabilities(7), sched(7)

Linux カーネルのソースツリー内の Documentation/scheduler/sched-nice-design.txt (Linux 2.6.23 以降)

この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。