资源描述:
《nice()调用改变进程优先级》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、可以通过改变进程的优先级来保证进程优先运行。在Linux下,通过系统调用nice()可以改变进程的优先级。nice()系统调用用来改变调用进程的优先级。函数声明如下:引用#includeintnice(intincrement);getpriority()和setpriority()两函数的声明:引用#includeintgetpriority(intwhich,inttwo);intsetpriority(intwhich,intwho,intprio);
2、getpriority()函数:该函数返回一组进程的优先级。参数which和who组合确定返回哪一组进程的优先级。which的可能取值以及who的意义如下:·PRIO_PROCESS:一个特定的进程,此时who的取值为进程ID。·PRIO_PGRP:一个进程组的所有进程,此时who的取值为进程组ID。·PRIO_USER:一个用户拥有的所有进程,此时参数who取值为实际用户ID。getpriority()函数如果调用成功返回指定进程的优先级,如果出错将返回-1,并设置errno的值。errno可能的取值如下:
3、·ESRCH:which和who的组合与现存的所有进程均不匹配·EINVAL:which是个无效的值注意:当指定的一组进程的优先级不同时,getpriority()将返回其中优先级最低的一个。此外,当getpriority()返回-1时,可能是发生错误,也有可能是返回的是指定进程的优先级。区分它们的惟一方法是在调用getpriority()前将errno清零。如果函数返回-1且errno不为零,说明有错误产生。setpriority()函数:该函数用来指定进程的优先级。进程指定的方法与getpriority(
4、)函数相同。如果调用成功,函数返回指定进程的优先级,出错则返回-1,并设置相应的errno。除了产生与getpriority()相同的两个错误外,还有可能产生以下错误。·EPERM:要设置优先级的进程与当前进程不属于同一个用户,并且当前进程没有CAP_SYS_NICE特许。·EACCES:该调用可能降低进程的优先级并且进程没有CAP_SYS_NICE特许。通过getpriority()和setpriority()完全可以改变进程的优先级。nice系统调用是它们的一种组合形式,nice系统调用等价于:引用int
5、nice(intincreamet){ intoldpro=getpriority(PRIO_PROCESS,getpid()); returnsetpriority(PRIO_PROCESS,getpid(),oldpro+increament);}测试程序:引用#include#include#include#include#include#includeintm
6、ain(void){ pid_tpid; intstat_val=0; intoldpri,newpri; printf("nicestudy"); pid=fork(); switch(pid){ case0: printf("Childisrunning,Curpidis%d,Parentpidis%d", pid,getppid()); oldpri=getpriority(PRIO_PROCESS,getpid()
7、); printf("Oldpriority=%d",oldpri); newpri=nice(2); printf("Newpriority=%d",newpri); exit(0); case-1: perror("Processcreationfailed"); break; default: printf("Parentisrunning,Childpidis%d,Parent
8、pidis%d",pid,getpid()); break; } wait(&stat_val); exit(0);}运行及输出:引用beyes@linux-beyes:~/C/base>./nice.exenicestudyChildisrunning,Curpidis0,Parentpidis4421Oldpriority=0Newpriority=2Parentis