sched_setparam 子例程

用途

设置调度参数。

标准 C 库 (libc.a)

语法

#include <sched.h>

int sched_setparam (pid, param)
pid_t pid;
const struct sched_param *param; 

描述

sched_setparam 子例程将由 pid 参数指定的进程的调度参数设置为由 param 参数指向的 sched_param 结构指定的值。 sched_param 结构中 sched_priority 成员的值是当前调度策略的包含优先级范围内的任何整数。 优先级的数字值越高表示优先级越高。

如果存在由 pid 参数指定的进程,并且如果调用进程具有许可权,那么将为进程标识等于 pid 参数值的进程设置调度参数。

如果 pid 参数为零,那么将为调用进程设置调度参数。

如果调用者偏爱进程,那么它必须具有 SET_PROC_RAC 权限。 调用者应该具有相同的有效或实际用户标识或 BYPASS_DAC_WRITE 权限来修改进程的优先级。

实现可能要求请求进程具有相应的权限来设置其自己的调度参数或其他进程的调度参数。

目标进程 (无论它是否正在运行) 将移动到线程列表的末尾以获取其优先级。

如果 pid 参数指定的进程的优先级设置为高于最低优先级正在运行的进程的优先级,并且如果指定的进程已准备好运行,那么 pid 参数指定的进程将抢占最低优先级正在运行的进程。 同样,如果调用 sched_setparam 子例程的进程将其自身的优先级设置为低于一个或多个其他非空进程列表的优先级,那么作为最高优先级列表的头的进程也会抢占调用进程的先机。 因此,在执行更高优先级的进程之前,始发进程可能不会收到完成所请求的优先级更改的通知。

其他调度策略 (例如, SCHED_FIFO2, SCHED_FIFO3, SCHED_FIFO4) 的行为类似于固定优先级调度策略 (例如, SCHED_FIFO 和 SCHED_RR)。

sched_setparam 子例程对个别线程的影响取决于线程的调度争用作用域:
  • sched_setparam 子例程对具有系统调度争用作用域的线程的调度没有任何影响。
  • 对于具有进程调度争用作用域的线程,线程的调度参数不受影响。 但是,这些线程相对于其他进程中的线程的调度可能取决于其进程的调度参数,这些参数使用 sched_setparam 子例程进行管理。

如果实现支持在多个内核调度实体的基础上复用库线程的两级调度模型,那么系统争用作用域线程的底层内核调度实体不受 sched_setparam 子例程的影响。

进程争用作用域线程的底层内核调度实体的调度参数将更改为 param 参数中指定的值。 在此调用完成后创建的供进程争用作用域线程使用的内核调度实体从进程继承其调度策略和关联的调度参数。

对于进程中的其他线程, sched_setparam 子例程不是原子子例程。 当此子例程调用正在更改底层内核调度实体的调度策略时,线程可能会继续执行。

参数

描述
pid 指定为其设置调度参数的进程。
PARAM 指向 sched_param 结构。

返回值

如果成功, sched_setparam 子例程将返回零。

如果sched_setparam子程序不成功,优先级保持不变,子程序返回值为-1,并设置errno表示错误。

错误代码

在下列情况下, sched_setparam 子例程失败:
描述
EINVAL 一个或多个请求的调度参数超出为指定进程标识的调度策略定义的范围。
EINVAL param 参数为空或地址错误
ENOTSUP 此接口不支持具有检查点功能的进程。
EPERM 请求进程无权设置指定进程的调度参数,或者没有调用 sched_setparam 子例程的相应权限。
ESRCH pid 参数为负数,或者找不到与 pid 参数指定的进程相对应的进程。