问题提出:为什么用nice系统调用降低进程优先级不成功
nice系统调用
nice函数声明:#include<unistd.h>
int nice(int increment);
nice系统调用包含getpriority和setpriority这两个函数
getpriority函数和setpriority函数
函数声明:#include<unistd.h>
int getpriority(int which, int who);
int setpriority(int which, int who, int prio);
nice系统调用是它们的一种组合形式:
int nice(int increment)
{
int oldpro = getpriority(PRIO_PROCESS, getpid());
return setpriority(PRIO_PROCESS, oldpro+increment);
}
示例:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/resource.h>
#include<sys/wait.h>
#include<errno.h>
int main(int argc,char *argv[])
{
pid_t pid;
int stat_val = 0;
int oldpri;
int newpri;
pid = fork();
switch(pid)
{
case 0 :
printf("子进程正在运行,当前pid:%d, 父进程pid:%d\n", pid, getppid());
oldpri = getpriority(PRIO_PROCESS, 0);
printf("old priority = %d\n", oldpri);
newpri = nice(-6);
//newpri = nice(6);
printf("new priority = %d\n", newpri);
exit(0);
case -1 :
perror("进程创建失败");
break;
default :
printf("父进程正在运行, 当前进程的pid:%d, 子进程的pid:%d\n", getpid(), pid);
break;
}
wait(&stat_val);
exit(0);
}
代码执行结果:
[dela@server1 dela_c]$ ./a.out
父进程正在运行, 当前进程的pid:18847, 子进程的pid:18848
子进程正在运行,当前pid:0, 父进程pid:18847
old priority = 0
new priority = -1
在上述代码中,newpri = nice(6); 输出的newpri是6, 而newpri = nice(-6); 则输出的newpri是-1, 这说明在执行这条语句时nice有可能出错了
不能用errno检测-1, 因为 int prio 的取值时-20到20, 所以返回-1有可能是出错,也有可能是设置的优先级
又因为只要newpri = nice(负值); 输出的newpri都是-1,由此可判断是这条语句nice时出错
prio代表的是进程的执行优先权, 数值越低就代表有较高的优先次序, 执行会比较频繁,
此优先权默认是0, 而只有超级用户允许降低此值,这样就可以解释为什么newpri = nice(负值); 会一直出错了
root用户执行此段代码结果如下:
[dela@server1 dela_c]$ sudo ./a.out
[sudo] password for dela:
父进程正在运行, 当前进程的pid:19592, 子进程的pid:19593
子进程正在运行,当前pid:0, 父进程pid:19592
old priority = 0
new priority = -6
总结:
setpriority(int which, int who, int prio);
第三个参数prio的取值介于-20至20之间, 代表进程的执行优先权, 数值越低, 代表具有越高的优先权, 执行会更频繁, 此优先权默认是0, 而只有超级用户root才允许降低此值