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>
で定義されている)。
カーネル内部では、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/
に書かれている。