getpriority() - Unix 和 Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于 TP  

getpriority() - Unix 和 Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

getpriority、setpriority - 获取/设置程序调度优先级

语法

#include <sys/time.h>
#include <sys/resource.h>

int getpriority(int which, int who);
int setpriority(int which, int who, int prio);

描述

通过 whichwho 指定的进程、进程组或用户的调度优先级可以通过 getpriority() 调用获取,并通过 setpriority() 调用设置。

which 的值可以是 PRIO_PROCESSPRIO_PGRPPRIO_USER,而 who 则根据 which 的值进行解释(对于 PRIO_PROCESS 为进程标识符,对于 PRIO_PGRP 为进程组标识符,对于 PRIO_USER 为用户 ID)。who 为零表示(分别)调用进程、调用进程的进程组或调用进程的真实用户 ID。Prio 是 -20 到 19 之间的值(但请参阅下面的注释)。默认优先级为 0;较低的优先级会导致更有利的调度。

getpriority() 调用返回指定进程中任何一个进程的最高优先级(最低数值)。setpriority() 调用将所有指定进程的优先级设置为指定值。只有超级用户可以降低优先级。

返回值

由于 getpriority() 可以合法地返回 -1,因此在调用之前需要清除外部变量 errno,然后在之后检查它以确定 -1 是错误还是合法值。如果 setpriority() 调用没有错误,则返回 0,否则返回 -1。

错误

标签描述
EINVAL which 不是 PRIO_PROCESSPRIO_PGRPPRIO_USER 之一。
ESRCH 使用指定的 whichwho 值找不到任何进程。
除了上面指出的错误之外,如果 setpriority() 可能会失败
EPERM 找到一个进程,但其有效用户 ID 与调用者的有效或真实用户 ID 均不匹配,并且没有特权(在 Linux 上:没有 CAP_SYS_NICE 功能)。但请参阅下面的注释。
EACCES 调用者尝试降低进程优先级,但没有所需的权限(在 Linux 上:没有 CAP_SYS_NICE 功能)。从 Linux 2.6.12 开始,此错误仅在调用者尝试将进程优先级设置为目标进程的 RLIMIT_NICE 软资源限制范围之外时才会发生;有关详细信息,请参阅 getrlimit(2)。

注释

fork(2) 创建的子进程继承其父进程的 nice 值。nice 值在 execve(2) 中保留。

EPERM 条件的详细信息取决于系统。以上描述是 POSIX.1-2001 中所说的,似乎在所有类 System V 系统上都遵循。2.6.12 之前的 Linux 内核要求调用者的真实或有效用户 ID 与进程 who 的真实用户匹配(而不是其有效用户 ID)。Linux 2.6.12 及更高版本要求调用者的有效用户 ID 与进程 who 的真实或有效用户 ID 匹配。所有类 BSD 系统(SunOS 4.1.3、Ultrix 4.2、4.3BSD、FreeBSD 4.3、OpenBSD-2.5、...)的行为与 Linux >= 2.6.12 相同。

实际优先级范围因内核版本而异。1.3.36 之前的 Linux 具有 -infinity..15。从内核 1.3.43 开始,Linux 的范围为 -20..19。在内核中,nice 值实际上使用相应的范围 40..1 表示(因为负数是错误代码),这些值由 setpriority() 和 getpriority() 系统调用使用。这些系统调用的 glibc 包装函数根据公式 unice = 20 - knice 处理用户空间和内核表示的 nice 值之间的转换。

在某些系统上,nice 值的范围为 -20..20。

包含 <sys/time.h> 现在已经不再需要,但可以提高可移植性。(实际上,<sys/resource.h> 定义了 rusage 结构,该结构具有在 <sys/time.h> 中定义的 struct timeval 类型的字段。)

符合标准

SVr4、4.4BSD(这些函数调用首次出现在 4.2BSD 中)、POSIX.1-2001。

参见



previous next Printer Friendly

广告


  

广告



广告