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

问题提出:为什么用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才允许降低此值


展开阅读全文

没有更多推荐了,返回首页