sched_setscheduler, sched_getscheduler - set and get scheduling policy/parameters
#include <sched.h>
int sched_setscheduler(pid_t pid, int policy,
const struct sched_param *param);
int sched_getscheduler(pid_t pid);
The sched_setscheduler() system call sets both the
scheduling policy and parameters for the thread whose ID is specified in
pid
. If pid
equals zero, the scheduling policy and
parameters of the calling thread will be set.
The scheduling parameters are specified in the param
argument, which is a pointer to a structure of the following form:
struct sched_param {
...
int sched_priority;
...
};
In the current implementation, the structure contains only one field,
sched_priority
. The interpretation of param
depends on
the selected policy.
Currently, Linux supports the following "normal" (i.e.,
non-real-time) scheduling policies as values that may be specified in
policy
:
the standard round-robin time-sharing policy;
for "batch" style execution of processes; and
for running very
low priority background jobs.
For each of the above policies, param->sched_priority
must be 0.
Various "real-time" policies are also supported, for special
time-critical applications that need precise control over the way in
which runnable threads are selected for execution. For the rules
governing when a process may use these policies, see
sched(7). The real-time policies that may be specified
in policy
are:
a first-in, first-out policy; and
a round-robin policy.
For each of the above policies, param->sched_priority
specifies a scheduling priority for the thread. This is a number in the
range returned by calling sched_get_priority_min(2) and
sched_get_priority_max(2) with the specified
policy
. On Linux, these system calls return, respectively, 1
and 99.
Since Linux 2.6.32, the SCHED_RESET_ON_FORK flag can
be ORed in policy
when calling
sched_setscheduler(). As a result of including this
flag, children created by fork(2) do not inherit
privileged scheduling policies. See sched(7) for
details.
sched_getscheduler() returns the current scheduling
policy of the thread identified by pid
. If pid
equals
zero, the policy of the calling thread will be retrieved.
On success, sched_setscheduler() returns zero. On
success, sched_getscheduler() returns the policy for
the thread (a nonnegative integer). On error, both calls return -1, and
errno
is set appropriately.
Invalid arguments: pid
is negative or param
is
NULL.
(sched_setscheduler()) policy
is not one of
the recognized policies.
(sched_setscheduler()) param
does not make
sense for the specified policy
.
The calling thread does not have appropriate privileges.
The thread whose ID is pid
could not be found.
POSIX.1-2001, POSIX.1-2008 (but see BUGS below). The SCHED_BATCH and SCHED_IDLE policies are Linux-specific.
Further details of the semantics of all of the above "normal" and "real-time" scheduling policies can be found in the sched(7) manual page. That page also describes an additional policy, SCHED_DEADLINE, which is settable only via sched_setattr(2).
POSIX systems on which sched_setscheduler() and
sched_getscheduler() are available define
_POSIX_PRIORITY_SCHEDULING in
<unistd.h>
.
POSIX.1 does not detail the permissions that an unprivileged thread requires in order to call sched_setscheduler(), and details vary across systems. For example, the Solaris 7 manual page says that the real or effective user ID of the caller must match the real user ID or the save set-user-ID of the target.
The scheduling policy and parameters are in fact per-thread
attributes on Linux. The value returned from a call to
gettid(2) can be passed in the argument pid
.
Specifying pid
as 0 will operate on the attributes of the
calling thread, and passing the value returned from a call to
getpid(2) will operate on the attributes of the main
thread of the thread group. (If you are using the POSIX threads API,
then use pthread_setschedparam(3),
pthread_getschedparam(3), and
pthread_setschedprio(3), instead of the
sched_*(2) system calls.)
POSIX.1 says that on success, sched_setscheduler() should return the previous scheduling policy. Linux sched_setscheduler() does not conform to this requirement, since it always returns 0 on success.
chrt(1), nice(2), sched_get_priority_max(2), sched_get_priority_min(2), sched_getaffinity(2), sched_getattr(2), sched_getparam(2), sched_rr_get_interval(2), sched_setaffinity(2), sched_setattr(2), sched_setparam(2), sched_yield(2), setpriority(2), capabilities(7), cpuset(7), sched(7)
This page is part of release 5.10 of the Linux man-pages
project. A description of the project, information about reporting bugs,
and the latest version of this page, can be found at
https://www.kernel.org/doc/man-pages/.