NOMBRE
getpriority, setpriority − obtiene/asigna la prioridad de planificación de un programa
SINOPSIS
#include
<sys/time.h>
#include <sys/resource.h>
int
getpriority(int which, int who);
int setpriority(int which, int
who, int prio);
DESCRIPCIÓN
La prioridad de planificación del proceso, grupo de procesos o usuario, según se indique en which y who se obtiene con la función getpriority y se asigna con setpriority. Which puede ser PRIO_PROCESS, PRIO_PGRP, o PRIO_USER, y who se interpreta en función de which (un indentificador de proceso para PRIO_PROCESS, un indentificador de grupo de procesos para PRIO_PGRP, y un identificador de usuario para PRIO_USER). Un valor cero de who indica (respectivamente) el proceso invocador, el grupo de proceso del proceso invocador, o el identificador de usuario real del proceso invocador. Prio es un valor que puede variar de −20 a 20 (vea la sección Observaciones más abajo) . La prioridad por defecto es 0; cuanto más baja es la prioridad más favorable es la planificación.
La llamada getpriority devuelve la prioridad más alta (el valor numérico más bajo) de la que disfruta cualquiera de los procesos especificados. La llamada setpriority asigna el valor especificado a las prioridades de todos los procesos especificados. Sólo el superusuario puede decrementar las prioridades (haciéndolas, por tanto, más altas).
VALOR DEVUELTO
Ya que getpriority legítimamente puede devolver el valor −1, es necesario borrar la variable externa errno antes de la llamada a la función y comprobar su valor más adelante para determinar si −1 es un error o un valor legítimo. La función setpriority devuelve 0 si no hay error o −1 si lo hay.
ERRORES
ESRCH |
No se encontró ningún proceso que cumpliera con los valores especificados por which y who. | ||
EINVAL |
Which no era PRIO_PROCESS, PRIO_PGRP, ni PRIO_USER. |
Además de los errores indicados arriba, setpriority puede fallar si:
EPERM |
Se encontró un proceso, pero ni el identificador de usuario efectivo ni el identificador de usuario real del invocador coinciden con su identificador de usuario efectivo. | ||
EACCES |
Un no superusuario intentó decrementar la prioridad de un proceso. |
OBSERVACIONES
Los detalles sobre la condición para EPERM dependen del sistema. La descripción dada arriba es lo que dice SUSv3, y parece ser seguida por todos los sistemas de tipo SYSV. Linux requiere que el identificador de usuario real o efectivo del invocador coincida con el usuario real del proceso who (en lugar de su identificador de usuario efectivo). Todos los sistemas de tipo BSD (SunOS 4.1.3, Ultrix 4.2, BSD 4.3, FreeBSD 4.3, OpenBSD-2.5, ...) requieren que el identificador de usuario efectivo del invocador coincida con el identificador de usuario real o efectivo del proceso who.
El rango real de prioridad varía entre las diferentes versiones del núcleo. Las versiones de Linux anteriores a la 1.3.36 tenían -infinito..15. A partir de la versión 1.3.43 se tiene -20..19, y la llamada al sistema getpriority devuelve 40..1 para estos valores (puesto que los números negativos son códigos de error). La llamada de biblioteca convierte N a 20-N.
Incluir <sys/time.h> no es obligatorio hoy día, pero incrementa la portabilidad. (De hecho, <sys/resource.h> define la estructura rusage con campos de tipo struct timeval definida en <sys/time.h>.)
CONFORME A
SVr4, 4.4BSD (estas funciones aparecieron por primera vez en 4.2BSD).