您的位置:首页 > 产品设计 > UI/UE

setuid()函数,setgid()函数,getpriority()函数,setpriority()函数,nice()函数

2016-03-14 10:01 441 查看


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()函数结果一样;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: