Name
getpriority, setpriority -
get/set program scheduling priority
Synopsis
#include <sys/time.h>
#include <sys/resource.h>
int getpriority(int which, int who);
int setpriority(int which, int who, int prio);
Description
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.
Which is one of
PRIO_PROCESS,
PRIO_PGRP, or
PRIO_USER, and
who is
interpreted relative to
which (a process identifier for
PRIO_PROCESS,
process group identifier for
PRIO_PGRP, and a user ID for
PRIO_USER). A
zero value for
who denotes (respectively) the calling process, the process
group of the calling process, or the real user ID of the calling process.
Prio is a value in the range -20 to 20 (but see the Notes below). The default
priority is 0; lower priorities cause more favorable scheduling.
The getpriority
call returns the highest priority (lowest numerical value) enjoyed by any
of the specified processes. The setpriority call sets the priorities of
all of the specified processes to the specified value. Only the super-user
may lower priorities.
Return Value
Since
getpriority can legitimately return
the value -1, it is necessary to clear the external variable
errno prior
to the call, then check it afterwards to determine if a -1 is an error or
a legitimate value. The
setpriority call returns 0 if there is no error,
or -1 if there is.
Errors
- ESRCH
- No process was located using the which and
who values specified.
- EINVAL
- Which was not one of PRIO_PROCESS, PRIO_PGRP,
or PRIO_USER.
In addition to the errors indicated above, setpriority may
fail if:
- EPERM
- A process was located, but neither the effective nor the
real user ID of the caller matches its effective user ID.
- EACCES
- A non super-user
attempted to lower a process priority.
Notes
The details on the condition
for EPERM depend on the system. The above description is what SUSv3 says,
and seems to be followed on all SYSV-like systems. Linux requires the real
or effective user ID of the caller to match the real user of the process
who (instead of its effective user ID). All BSD-like systems (SunOS 4.1.3,
Ultrix 4.2, BSD 4.3, FreeBSD 4.3, OpenBSD-2.5, ...) require the effective user
ID of the caller to match the real or effective user ID of the process
who.
The actual priority range varies between kernel versions. Linux before
1.3.36 had -infinity..15. Linux since 1.3.43 has -20..19, and the system call getpriority
returns 40..1 for these values (since negative numbers are error codes). The
library call converts N into 20-N.
Including <sys/time.h> is not required these
days, but increases portability. (Indeed, <sys/resource.h> defines the rusage
structure with fields of type struct timeval defined in <sys/time.h>.)
Conforming
to
SVr4, 4.4BSD (these function calls first appeared in 4.2BSD).
See Also
nice(1)
,
fork(2)
,
renice(8)
Add a comment | Add a link