O belo (2) syscall está mudando o parente priority (do que era antes daquele syscall). Mas a prioridade definida (2) está mudando a prioridade absoluta .
Então, meu entendimento é que nice(x)
(com x
sendo um número muito pequeno, por exemplo, entre 0 e 9) é o equivalente a atomicamente fazer:
// asssume both getpriority & setpriority syscalls are successful
int n = getpriority(PRIO_PROCESS, 0);
n += x;
setpriority(PRIO_PROCESS, 0, n);
Como vários processos podem fazer o mesmo no mesmo processo (por exemplo, chamando setpriority(PRIO_PROCESS, somepid, n);
....), você terá uma operação atômica combinando-os, e isso é nice(2)
Mas o principal motivo é legado e histórico (e compatibilidade com versões anteriores). IIRC, nos anos 80 o Unix (como o SunOS3.2) tinha nice
mas não setpriority
(mas eu posso estar errado).