SCHED_SETSCHEDULER(2) (2017-09-15) SCHED_SETSCHEDULER(2) NAME sched_setscheduler, sched_getscheduler - set and get scheduling policy/parameters SYNOPSIS #include <sched.h> int sched_setscheduler(pid_t pid, int policy, const struct sched_param *param); int sched_getscheduler(pid_t pid); DESCRIPTION The sched_setscheduler() system call sets both the schedul- ing policy and parameters for the thread whose ID is speci- fied 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 argu- ment, 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: SCHED_OTHER the standard round-robin time-sharing policy; SCHED_BATCH for "batch" style execution of processes; and SCHED_IDLE 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 execu- tion. For the rules governing when a process may use these policies, see sched(7). The real-time policies that may be Page 1 Linux (printed 5/22/22) SCHED_SETSCHEDULER(2) (2017-09-15) SCHED_SETSCHEDULER(2) specified in policy are: SCHED_FIFO a first-in, first-out policy; and SCHED_RR a round-robin policy. For each of the above policies, param->sched_priority speci- fies 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. RETURN VALUE 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. ERRORS EINVAL Invalid arguments: pid is negative or param is NULL. EINVAL (sched_setscheduler()) policy is not one of the recog- nized policies. EINVAL (sched_setscheduler()) param does not make sense for the specified policy. EPERM The calling thread does not have appropriate privi- leges. ESRCH The thread whose ID is pid could not be found. CONFORMING TO POSIX.1-2001, POSIX.1-2008 (but see BUGS below). The SCHED_BATCH and SCHED_IDLE policies are Linux-specific. NOTES Page 2 Linux (printed 5/22/22) SCHED_SETSCHEDULER(2) (2017-09-15) SCHED_SETSCHEDULER(2) Further details of the semantics of all of the above "nor- mal" and "real-time" scheduling policies can be found in the sched(7) manual page. That page also describes an addi- tional 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.) BUGS 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. SEE ALSO 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) COLOPHON 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/. Page 3 Linux (printed 5/22/22)