一.更改用户 I D和组I D
可以用setuid函数设置实际用户ID和有效用户ID。与此类似,可以用 setgid函数设置实际组ID和有效组ID。
int setgid(gid_t gid) ;
两个函数返回:若成功则为 0,若出错则为- 1
关于谁能更改 ID有若干规则。现在先考虑有关改变用户 I D的规则(在这里关于用户 ID所说明的一切都适用于组 ID)。
(1) 若进程具有超级用户特权,则 setuid函数将实际用户 ID、有效用户 ID,以及保存的设置-用户- ID设置为uid。
(2) 若进程没有超级用户特权,但是 u i d等于实际用户I D或保存的设置 -用户- ID,则setuid只将有效用户I D设置为uid。不改变实际用户ID和保存的设置-用户- ID。
(3) 如果上面两个条件都不满足,则 errno设置为EPERM,并返回出错。
在这里假定 _POSIX_SAED_IDS为真。如果没有提供这种功能,则上面所说的关于保存的设置-用户- I D部分都无效。
关于内核所维护的三个用户 I D,还要注意下列几点:
(1) 只有超级用户进程可以更改实际用户 I D 。通常,实际用户 I D是在用户登录时,由login ( 1 )程序设置的,而且决不会改变它。因为 login是一个超级用户进程,当它调用 setuid时,设置所有三个用户 I D。
(2) 仅当对程序文件设置了设置-用户- I D位时, exec函数设置有效用户 I D。如果设置 -用户- I D位没有设置,则 exec函数不会改变有效用户 I D,而将其维持为原先值。任何时候都可以调用setuid,将有效用户 I D设置为实际用户 I D或保存的设置 -用户- I D。自然,不能将有效用户I D设置为任一随机值。
(3) 保存的设置-用户- I D是由exec从有效用户ID复制的。在exec按文件用户I D设置了有效用户I D后,即进行这种复制,并将此副本保存起来。
二.改变进程的优先级
可以通过设置进程的优先级来保证进程的优先运行,在linux下,通过系统调用的nice可以改变进程的优先级,nice系统调用来改变调用进程的优先级
#include <unistd.h>
int nice (int increment );
返回说明:
成功执行时,返回新的nice值。失败返回-1
先了解两个重要函数的用法:getpriority和setpriority
getpriority:该函数返回一组进程的优先级
#include <sys/time.h>
#include <sys/resource.h>
int getpriority(int which, int who);
出错返回-1,错误原因存于errno。
ESRCH 参数which或who 可能有错,而找不到符合的进程
EINVAL 参数which值错误。
getpriority() 的 which 参数用來指定要取得 priority 对象:process、process group 或 user ID。
which 参数:
PRIO_PROCESS:who 参数指定 process ID,传回 process 的 priority。
PRIO_PGRP:who 参数指定 process group ID,传回 process group 的 priority。
PRIO_USER:who参数指定 user ID,传回 user 的 priority 。
setpriority:该函数用来设置指定进程的优先级
#include<sys/time.h>
#include<sys/resource.h>
int setpriority(int which,int who, int prio);
出错返回-1,错误原因存于errno。
ESRCH 参数which或who 可能有错,而找不到符合的进程
EINVAL 参数which值错误。
EPERM 权限不够,无法完成设置
EACCES 一般用户无法降低优先权
setpriority()可用来设置进程、进程组和用户的进程执行优先权。参数which有三种数值,参数who 则依which值有不同定义
which who 代表的意义
PRIO_PROCESS who为进程识别码
PRIO_PGRP who 为进程的组识别码
PRIO_USER who为用户识别码
nice的系统调用等价于
int nice(int increment )
{
int oldpro = getpriority(PRIO_PROCESS ,getpid());
return setpriority( PRIO_PROCESS ,getpid() ,oldpro + increment );
}
三:概念
1.输入/输出重定向
在Linux命令行模式中,如果命令所需的输入不是来自键盘,而是来自指定的文件,这就是输入重定向。同理,命令的输出也可以不显示在屏幕上,而是写入到指定文件中,这就是输出重定向。
输入重定向和输出重定向
# wc aa.txt
# ls > home.txt
第一条命令将文件aa.txt作为wc命令的输入,统计出aa.txt的行数、单词数和字符数。第二条命令将ls命令的输出保存在一个名为home.txt的文件中。如果>符号后边的文件已存在,那么这个文件将被重写。
2.管道
利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
利用一个管道
# rpm -qa|grep licq
这条命令使用一个管道符“|”建立了一个管道。管道将rpm -qa命令的输出(包括系统中所有安装的RPM包)作为grep命令的输入,从而列出带有licq字符的RPM包来。