内容简介
#include <sys/time.h>%uA0#include <sys/resource.h>
int getpriority(int%uA0which, int%uA0who)%uA0
int setpriority(int%uA0which, int%uA0who, int%uA0prio)
描述
The scheduling priority of the process, process group, or user, as indicated by%uA0which%uA0andwho%uA0is obtained with the%uA0getpriority() call and set with the%uA0setpriority() call.The value%uA0which%uA0is one of%uA0PRIO_PROCESS,%uA0PRIO_PGRP, or%uA0PRIO_USER, and%uA0who%uA0is interpreted relative to%uA0which%uA0(a process identifier for%uA0PRIO_PROCESS, process group identifier for%uA0PRIO_PGRP, and a user ID for%uA0PRIO_USER). A zero value for%uA0whoꃞnotes (respectively) the calling process, the process group of the calling process, or the real user ID of the calling process.%uA0Prio%uA0is a value in the range -20 to 19 (but see the Notes below). The default priority is 0 lower priorities cause more favorable scheduling.
The%uA0getpriority() call returns the highest priority (lowest numerical value) enjoyed by any of the specified processes. The%uA0setpriority() call sets the priorities of all of the specified processes to the specified value. Only the superuser may lower priorities.
返回值
Since%uA0getpriority() can legitimately return the value -1, it is necessary to clear the external variable%uA0errno%uA0prior to the call, then check it afterwards to determine if a -1 is an error or a legitimate value. The%uA0setpriority() call returns 0 if there is no error, or -1 if there is.错误
标签 | 描述 |
---|---|
EINVAL | which%uA0was not one of%uA0PRIO_PROCESS,%uA0PRIO_PGRP, orPRIO_USER. |
ESRCH | No process was located using the%uA0which%uA0and%uA0who%uA0values specified. |
In addition to the errors indicated above,%uA0setpriority() may fail if: | |
EPERM | A process was located, but its effective user ID did not match either the effective or the real user ID of the caller, and was not privileged (on Linux: did not have the%uA0CAP_SYS_NICEcapability). But see NOTES below. |
EACCES | The caller attempted to lower a process priority, but did not have the required privilege (on Linux: did not have theCAP_SYS_NICEꃊpability). Since Linux 2.6.12, this error only occurs if the caller attempts to set a process priority outside the range of the%uA0RLIMIT_NICE%uA0soft resource limit of the target process see%uA0getrlimit(2) for details. |
注意
A child created by%uA0fork(2) inherits its parent’s nice value. The nice value is preserved across%uA0execve(2).The details on the condition for EPERM depend on the system. The above description is what POSIX.1-2001 says, and seems to be followed on all System V-like systems. Linux kernels before 2.6.12 required the real or effective user ID of the caller to match the real user of the process%uA0who%uA0(instead of its effective user ID). Linux 2.6.12 and later require the effective user ID of the caller to match the real or effective user ID of the process%uA0who. All BSD-like systems (SunOS 4.1.3, Ultrix 4.2, 4.3BSD, FreeBSD 4.3, OpenBSD-2.5, ...) behave in the same manner as Linux >= 2.6.12.
The actual priority range varies between kernel versions. Linux before 1.3.36 had -infinity..15. Since kernel 1.3.43 Linux has the range -20..19. Within the kernel, nice values are actually represented using the corresponding range 40..1 (since negative numbers are error codes) and these are the values employed by the%uA0setpriority() andgetpriority() system calls. The glibc wrapper functions for these system calls handle the translations between the user-land and kernel representations of the nice value according to the formula%uA0unice = 20 - knice.
On some systems, the range of nice values is -20..20.
Including%uA0<sys/time.h>%uA0is not required these days, but increases portability. (Indeed,<sys/resource.h>ꃞfines the%uA0rusage%uA0structure with fields of type%uA0struct timevalꃞfined in%uA0<sys/time.h>.)