1.setuid()函数,setgid() 函数,
头文件:#include <sys/types.h> #include <types.h> 函数原型:int setuid(uid_t uid); int setgid(gid_t gid); 函数说明:若进程具有root 权限, 则函数 将实际用户的ID(组), 有效用户的ID(组),都设置为参数uid; 若进程不具有root权限,但uid等于 实际用户 ID(组), 则 setuid 只将有效用户的ID(组)设置为uid,不改变实际用户ID; 若以上两个条件都不满足,则函数调用失败,返回 -1;并设置错误为EPERM. 也就是说,只有超级用户才能更改实际用户的 ID, 所以一个非root 用户进程是不能通过setuid和setgid得到特权用户权限的,但su命令能将一个普通用户变成特权用户,这并不矛盾,因为su是一个"set_uid程序",执行一个设置了set_uid位的程序时,内核将进程的有效用户iD 设置为文件属主的ID,而检查一个进程是否有访问某个文件的权限时,是使用进程的有效 ID来进行检查的.su程序的文件属主是root,普通用户运行su 时,su的进程权限就是root 权限.
2.getpriority()函数,setpriority()函数
头文件:#include <sys/resource.h> 函数原型:int getpriority(int which,int who); int setpriority(int which,int who, int prio); getpriority()函数:该函数返;回一组进程的优先级,参数which,who组合确定返回哪一个组进程的优先级,which的可能取值以及who的意义如下:
- PRIO_PROCESS:一个特定的进程,此时who的取值为进程的ID;
- PRIO_PGRP:一个进程组的所有进程,who为进程组ID
- PRIO_USER: 一个用户拥有的所有进程,who为实际用户 ID;
调用成功返回指定进程的优先级,错误返回-1;并设置errno的值: errno的取值:
- ESRCH:which和who的组合和现存的进程不匹配;
- EINVAL:which无效;
注意:当指定一组进程的优先级不同时,getpriority将返回其中优先级最低的. setpriority()函数:函数设置指定进程的优先级,成功返回指定进程的优先级,错误返回-1;errno除了与getpriority相同的错误外,还有错误:
- EPERM:要设置优先级的进程与当前进程不属于同一同一个用户,并且当前进程没有CAP_SYS_NICE的特许;
- EACCES:该调用可能降低进程的优先级并且进程并没有CAP_SYS_NICE特许;|
参数prio介于-20至20之间。代表进程执行优先权,数值越低代表有较高的优先次序,执行会较频繁。此优先权默认是0,而只有超级用户(root)允许降低此值。执行成功则返回0,如果有错误发生返回值则为-1,错误原因存于errno。
3.nice()函数
头文件:#include <unistd.h> 函数原型:int nice(int increment); 通过以上两个函数,完全可以改变进程的优先级, nice系统调用只是它们的一种组合,nice系统调用等价于: int nice(int increment) { int oldpro=getpriority(PRIO_PROCESS,getpid()); if(setpriority(PRIO_PROCESS,getpid(),increment)==-1); printf("设置出错!\n"); int newpri=getpriority(PRIO_PROCESS,getpid()); return newpri; } 看个例子:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/resource.h> #include <sys/wait.h> intmain() { pid_t pid; int stat_val = 0; int oldpri,newpri; printf("nice实例:\n"); pid=fork(); switch(pid) { case 0: printf("子进程正在运行,当前的ID = %d,父进程的ID = %d\n",getpid(),getppid()); oldpri=getpriority(PRIO_PROCESS,getpid()); printf("现在的优先级 = %d\n",oldpri); //newpri = nice(4); if((setpriority(PRIO_PROCESS,getpid(),4))==-1) printf("出错!\n"); newpri=getpriority(PRIO_PROCESS,getpid()); printf("改变后的新的优先级 = %d\n",newpri); exit(0); case -1: perror("进程创建失败!\n"); break; default: printf("父进程正在运行,子进程的ID = %d,父进程的 ID = %d\n",pid,getpid()); break; } wait(&stat_val); }
结果:
yang@liu:~/Linux C$ gcc mynice.c yang@liu:~/Linux C$ ./a.out nice实例: 父进程正在运行,子进程的ID = 732,父进程的 ID = 731 子进程正在运行,当前的ID = 732,父进程的ID = 731 现在的优先级 = 0 改变后的新的优先级 = 4
用nice()函数结果一样;