#define _GNU_SOURCE
#include <sched.h>
int sched_setaffinity(pid_t pid, unsigned int cpusetsize,
cpu_set_t *mask);
int sched_getaffinity(pid_t pid, unsigned int cpusetsize,
cpu_set_t *mask);
void CPU_CLR(int cpu, cpu_set_t *set);
int CPU_ISSET(int cpu, cpu_set_t *set);
void CPU_SET(int cpu, cpu_set_t *set);
void CPU_ZERO(cpu_set_t *set);
CPU affinity マスクは「CPU の集合」を表す cpu_set_t 構造体で表現され、 cpu_set_t へのポインタ mask で指定される。 CPU 集合を操作するためのマクロが 4 種類提供されている。 CPU_ZERO() は集合をクリアする。 CPU_SET() と CPU_CLR() はそれぞれ指定された CPU の集合への追加/削除を行う。 CPU_ISSET() はある CPU が集合に含まれているかの確認を行う。このマクロは sched_getaffinity() を呼び出した後で使用すると便利である。 システム上にある最初の CPU が cpu 値 0 に、次の CPU は cpu 値 1 に対応し、以後同様である。 定数 CPU_SETSIZE (1024) は、CPU 集合に入る CPU 番号の最大値より 1 大きい値を示す。
sched_setaffinity() は、プロセスID が pid のプロセスの CPU affinity マスクを mask で指定された値に設定する。 pid が 0 の場合、呼び出し元プロセスが使われる。引き数 cpusetsize には mask が指すデータの長さ (バイト単位) である。 通常は、この引き数には sizeof(cpu_set_t) を指定すればよい。
pid で指定されたプロセスが mask で指定された CPU のいずれかで現在実行されていない場合、 そのプロセスは mask で指定された CPU のいずれかに移動される。
sched_getaffinity() は、 プロセスID が pid のプロセスの affinity マスクを mask が指す cpu_set_t 構造体に書き込む。 cpusetsize 引き数には mask の (バイト単位の) 大きさを指定する。
関数 sched_getaffinity() は長さ len のポインタ mask にプロセス pid の affinity マスクを書き込む。 pid が 0 の場合、呼び出し元のプロセスのマスクが返される。
fork(2) 経由で生成された子プロセスは親プロセスの CPU affinity マスクを継承する。 affinity マスクは execve(2) の前後で保存される。
このマニュアルページでは CPU affinity コールの glibc インタフェースを 説明している。実際のシステムコール・インタフェースは少し違っており、 実際の実装では CPU 集合は簡単なビットマスクであるという実状を反映し、 mask の型が unsigned long * となっている。 成功時には、生の sched_getaffinity() システムコール自身は cpumask_t データ型の (バイト単位の) 大きさを返す。 cpumask_t はカーネル内部で CPU 集合のビットマスクを表現するのに 使われているデータ型である。
sched_setscheduler(2) には Linux におけるスケジューリングの概略が記述されている。