通过系统调用nice改变进程优先级

来源:互联网 发布:mac usb耗电量大 编辑:程序博客网 时间:2024/05/16 23:56

问题提出:为什么用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:18847old priority = 0new 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:19592old priority = 0new priority = -6

总结:


setpriority(int which, int who, int prio);
第三个参数prio的取值介于-20至20之间, 代表进程的执行优先权, 数值越低, 代表具有越高的优先权, 执行会更频繁, 此优先权默认是0, 而只有超级用户root才允许降低此值


0 0
原创粉丝点击