进程控制(3)

进程控制(1)进程控制(2)中介绍了进程控制的几个基本操作函数,fork、exec系列、exit、wait和waitpid等。在这篇文章中将要介绍与进程相关的ID知识以及进程会计和进程调度。

与进程相关的ID有以下几个:
这里写图片描述
1、实际用户ID
标识进程的执行者。可以看做是我们登录的ID,由login程序在登录时进行设置,一般不改变。只有超级用户可以改变RUID。
2、有效用户ID
标识进程执行时文件的访问权限,一般情况下与实际用户ID相同,由exec函数进行设置,只有在set-user ID被设置时才可能发生变化。也有不一样的情况,比如我们修改自己密码时需要访问passwd文件,这是需要改变有效用户ID为root才能访问。
3、设置用户ID
设置用户ID其实是一种机制,有时我们访问一个文件的时候,需要获取这个文件的所有者的权限。如果该文件的设置用户ID位已经被设置,那么程序执行时就可以吧EUID设置为文件所有者的ID,然后save set-user ID用于保存EUID的一个副本。

更改用户ID和更改组ID
可以使用以下函数设置实际用户ID和有效用户ID,类似的setgid可以设置实际组ID和有效组ID。

include <unistd.h>
int setuid(uid_t uid);
int setgid(gid_t gid);
 return: 0 if OK,−1 on error

更改的规则有以下三点:
1、如果进程用户具有超级用户权限,则setuid( uid)将实际用户ID、有效用户ID、设置用户ID全部设为uid。
2、如果进程用户没有超级用户权限,且uid等于实际用户ID或者设置用户ID, setuid(uid_t uid) 将有效用户ID设置为uid,不更改实际用户ID和保存的设置用户ID。
3、上面两个条件都不满足时,errno设置为EPERM,并且返回-1。

此外对于exec函数要进行说明:
在执行 exec 前后进程的实际用户 ID 和实际组 ID 保持不变,而有效用户 ID 和有效组 ID 是否改变跟要执行的程序文件的设置用户 ID 和设置组 ID 位有关。即为以下两点:
1、仅当对程序文件设置了设置用户ID,exec函数才会设置有效用户ID,如果没有则有效用户ID不变。
2、保存的设置用户ID是由exec复制有效用户ID得到的。执行 exec 之后,进程的有效用户 ID 将被设置为要执行的程序文件的所有者即有效用户ID。(对于有效组 ID 的情况类似。)
可以总结为下图:
这里写图片描述
此外还有几组函数用于更改用户ID和组ID

#include <unistd.h>
int setreuid(uid_t ruid,uid_t euid);
int setregid(gid_t rgid,gid_t egid);
 return: 0 if OK,−1 on error

规则如下:
交换实际用户的ID值和有效用户的ID值。如果其中任意一个参数的值为-1,则表示相应的ID应当保持不变。

#include <unistd.h>
int seteuid(uid_tuid);
int setegid(gid_tgid);
 return: 0 if OK,−1 on error

这两个函数类似于setuid和setgid,但是它只是更改有效用户ID和有效组ID。
上述三组函数可以总结如下图:
这里写图片描述

进程会计
通常unix系统提供了一个选项以进行进程会计处理。启用该选项之后,每当进程结束时内核就会写一个会计记录。典型的会计记录包含总量较小的二进制数据,一般包括命令名、所使用的CPU时间总量、用户ID和组ID等,这样多了在一次观察进程的机会。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值